2017-05-06 2 views
0

Bonjour je suis nouveau ici et pas un locuteur natif anglais alors s'il vous plaît pardonnez-moi pour toute erreur sur ma grammaire et sur la mise en forme de ma question.Laravel union dans les fonctions du modèle

Je construis une application avec php en utilisant la version 5.4 de laravel framework. L'application web est très simple pour examiner les articles et les utilisateurs qui publient des articles.

Je voudrais apprendre comment je peux unir les résultats des fonctions dans mon modèle. Je souhaite que la fonction allReviews du modèle utilisateur renvoie les avis que l'utilisateur a mélangés avec les avis que ses articles ont été créés par orderby.

laissez-moi vous expliquer mieux.

voici mes 3 tables principales:

Users  | Articles | Reviews 
--------- | --------- | --------- 
id  | id  | id 
name  | user_id | reviewable_id 
email  | title  | reviewable_type 
password | body  | reviewtext 
etc..  | etc..  | created_time 

et voici mon code modèles:

class User extends Model{ 

    protected $table = 'users'; 

    public function articles() 
    { 
     return $this->hasMany(Article::class,'user_id'); 
    } 

    public function reviews(){ 
     return $this->morphMany(Review::class,'reviewable'); 
    } 

    public function allReviews(){ 
     /* 
     i want union something like this: 

     $result = $this->reviews() union 
     foreach ($this->Articles() as $Article) { 
      union $Article->reviews(); 
     } 
     orderby created_time ASC or DESC doesn't matter 

     return $result 
     */ 
    } 
} 

class Article extends Model{ 

    protected $table = 'articles'; 

    public function user() 
    { 
     return $this->belongsTo(User::class,'user_id'); 
    } 

    public function reviews(){ 
     return $this->morphMany(Review::class,'reviewable'); 
    } 
} 

class Review extends Model{ 

    protected $table = 'reviews'; 

    public function reviewable(){ 
     return $this->morphTo('reviewable'); 
    } 
} 

Alors ma question est de savoir comment je peux faire la fonction allReviews d'un utilisateur à travailler?

Toute aide est appréciée :) Merci

Répondre

0

Appeler le $ user-> Bâtiment retournera tous les modèles révisables. Vous n'avez rien à UNION, Eloquent prendra soin de cela pour vous.

Essayez ceci:

public function allReviews(){ 
    $reviews = new \Illuminate\Database\Eloquent\Collection; 

    foreach($this->articles as $article) 
    { 
     $reviews = $reviews->merge($article->reviews); 
    } 

    $reviews = $reviews->merge($this->reviews); 

    return $reviews; 
} 

Je suis vraiment fatigué et j'ai un sentiment que vous pourriez obtenir la situation du problème de la requête N + 1 ici, mais il devrait fonctionner pour vous.

+0

je vous remercie pour votre réponse rapide, mais cela ne renvoie que les commentaires l'utilisateur a obtenu je veux retourner les commentaires l'utilisateur a + les commentaires les articles qu'il a écrit et de les mélanger les résultats et les faire par ordre chronologique. merci – NesJohnL

+0

Vous semblez avoir un nom de table en double, vous utilisez 'articles' à la fois pour le modèle Articles et le modèle Reviews. En outre, votre classe de modèle ne doit pas être au pluriel. Renommer les avis à revoir. Changez la propriété Review-> table en 'reviews' et créez une migration correcte. – user3010273

+0

ahhh je suis vraiment désolé juste remarqué et changé mais je ne sais pas comment faire la fonction allReviews travail :( – NesJohnL