2017-05-06 52 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