2017-05-06 53 views
0

你好,我是新来的,而不是一个母语为英语的人,所以请原谅我的语法错误和我的问题格式。Laravel联盟在模型功能

我正在用php使用laravel框架5.4版本构建一个应用程序。 网络应用程序非常简单,用于审阅发布文章的文章和用户。

我想了解如何将我的模型中的函数结果联合起来。 我想要用户模型的allReviews函数返回用户与评论混合的评论,他的文章有orderby createdtime。

让我解释得更好。

这里是我的3页主要的表:

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

,这里是我的模型代码:

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'); 
    } 
} 

所以我的问题是我怎么可以从用户做功能allReviews工作?

任何帮助表示赞赏:) 谢谢

回答

0

调用$用户>的评论属性将返回所有审查的车型。你不需要联盟任何东西,雄辩会为你照顾。

试试这个:

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; 
} 

我现在真的累了,我有一种感觉,你可以在这里得到了N + 1查询问题的情况,但它应该为你工作。

+0

感谢您的快速回复,但这只会返回用户的评论 我想返回用户的评论+评论他撰写的文章并将这些结果联合起来,并通过创建时间使它们排序。 谢谢 – NesJohnL

+0

您似乎有一个重复的表名称,您在文章模型和评论模型中都使用“文章”。 此外,你的模型类不应该是复数形式。重命名审查。将Review-> table属性更改为“reviews”并创建适当的迁移。 – user3010273

+0

ahhh我真的很抱歉只是注意到并改变了它,但我仍然不知道如何使功能allReviews工作:( – NesJohnL