2017-05-06 14 views
0

こんにちは、私はここで新しいです。ネイティブの英語のスピーカーではありませんので、私の文法や質問の書式上の間違いを私に許してください。モデル内のLaravel union

私は、laravel framework 5.4バージョンを使用してphpでアプリケーションを構築しています。 ウェブアプリは、記事や記事を投稿するユーザーをレビューするのに非常に簡単です。

私は自分のモデル内で関数の結果をどのように結合できるかを知りたいと思います。 ユーザーモデルからのallReviews関数が、ユーザーがorderby createdtimeを持っているレビューとユーザーが混合したレビューを返すようにします。

私はより良い説明をさせてください。だから私の質問は、私が動作するように、ユーザからの機能allReviewsを行うことができる方法である

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

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

、ここでは私のモデルであるコード:ここ

は私の主に3つのテーブルのですか?

すべてのヘルプは高く評価され:) は

答えて

0

がする$ user-を呼び出すありがとう>プロパティは、すべて検討可能なモデルを返しますレビュー。あなたはUNIONに何もする必要はありません、Eloquentがそれを世話します。

これを試してみてください:

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

テーブル名が重複しているようですが、記事モデルとレビューモデルの両方に「記事」を使用しています。 また、モデルクラスは複数形であってはいけません。レビューをレビューに変更します。レビュー - >表のプロパティを「レビュー」に変更し、適切な移行を作成します。 – user3010273

+0

ああ本当にそれを気づいて変更しましたが、それでも機能をどうやって作ったのか分かりません: – NesJohnL