2017-09-01 2 views
0

Il y a trois tables dans mon système:Comment obtenir une seule table via Laravel Eloquent

  1. étudiants
  2. Articles
  3. catégories

Un étudiant peut écrire de nombreux articles et un article appartient à un seul étudiant. Et un article ne peut avoir qu'une seule catégorie.

Article Modèle

class Articles extends Model 
{ 
    protected $fillable = ['id','title', 'body', 'students_id', 'created_at', 'updated_at']; 
    protected $table = 'articles'; 

    public function students(){ 
     return $this->belongsTo('App\Students'); 
    } 

    public function categories(){ 
     return $this->belongsTo('App\Categories'); 
    } 
} 

J'ai créé le code ci-dessus, parce que je devais obtenir une liste d'articles avec qui écrit par cet article avec le nom de la catégorie.

Pour cela j'ai utilisé $article_list = Articles::get(); dans le contrôleur, et cela fonctionne parfaitement.

Encore une fois, j'avais besoin d'obtenir la liste des articles (cette fois je n'ai pas besoin du nom de l'étudiant et des noms de catégories, la sortie de la table article est plus que suffisante).

Mais si j'utilise $article_list = Articles::get();, il sort également la table d'articles en joignant la catégorie et la table des étudiants.

Existe-t-il un moyen d'obtenir uniquement la table article en utilisant Eloquent?

+0

Vous pouvez utiliser le générateur de requête pour cela –

+0

Que voulez-vous dire par * il sort la table d'article en joignant la catégorie et les étudiants *? Etes-vous sûr que les données de l'étudiant et de la catégorie sont réellement * id * dans le résultat obtenu ou sont-elles simplement des objets relationnels sur le modèle éloquent? – lesssugar

+0

@lesssugar Oui. J'obtiens le même résultat en utilisant '$ articles = Articles :: with ('students') -> avec ('categories') -> get();' et '$ articles = Articles :: get();'. J'ai confus à cause de cela. Je veux dire après foaeach, je peux accéder au nom de la catégorie en utilisant '{{$ article ['categories'] ['name']}}'. Donc, je sais qu'ils ont été rejoints .... –

Répondre

1

Les relations au sein d'Eloquent sont très sollicitées, donc vous êtes en sécurité et ce n'est pas grave que des catégories soient également chargées. Extrait des docs:

Lors de l'accès aux relations Eloquent en tant que propriétés, la relation data est "paresseuse". Cela signifie que les données de relation ne sont pas réellement chargées tant que vous n'avez pas accédé à la propriété pour la première fois.

https://laravel.com/docs/5.4/eloquent-relationships#eager-loading

+0

Ceci est la bonne réponse. –

+0

@ Don'tPanic Que diriez-vous de la performance? –

+0

@IamtheMostStupidPerson Vous allez bien avec la performance. Les données ne sont pas réellement chargées jusqu'à ce que vous accédiez à une propriété en premier. C'est un avantage de chargement impatient. – jjj

0

essayer:

class Articles extends Model 
{ 
    protected $fillable = ['id','title', 'body', 'students_id', 'created_at', 'updated_at']; 
    protected $table = 'articles'; 

    public function students(){ 
     return $this->belongsTo('App\Students'); 
    } 

    public function categories(){ 
     return $this->hasOne('App\Categories'); 
    } 
} 

class Student extends Model 
{ 
    public function articles(){ 
     return $this->hasMany('App\Articles'); 
    } 
} 

vous pouvez essayer a de nombreux à travers une relation Type

lien officiel: read more

0

@ réponse de jjj est la bonne, mais d'expliquer dans un bi t plus de détail:

$articles = Articles::get(); 

chargera les seuls articles. Vous pouvez vérifier comme ceci dans votre contrôleur:

public function articles() { 
    $articles = Articles::get(); 
    return $articles; 
} 

Mais $articles est une collection de modèles, et chaque modèle est « conscient » de ce sont les relations. Donc, si vous essayez d'accéder à l'une de ces relations, Laravel le chargera silencieusement pour vous.Donc, si vous passez le même $articles ci-dessus à votre vue (actuellement sans catégories), puis à votre avis faire quelque chose comme:

@foreach ($articles as $article) 
    {{ $article->categories->name }} 
@endforeach 

cela fonctionnera, parce que Laravel fait le SQL pour trouver la catégorie de chaque article et prénom. Comme l'explique @jjj, ceci est appelé chargement paresseux et est décrit dans les docs.

Incidemment chargement paresseux comme ceci est généralement inefficace, et il serait préférable de charger ardemment, comme vous le montrez dans un de vos commentaires ci-dessus. It is described well in the docs.