2017-04-13 8 views
0

PostsCommentsのテーブルがあり、各投稿に複数のコメントを付けることができます。ユーザーがログインしている場合のみリレーションシップを返しますか?

すべての投稿とログインしたすべてのユーザーのコメントを取得するクエリを作成します。ここで

は、私がこれまで持っているものです。

$posts = Post::select('posts.*') 
    ->with(['comments' => function($query) { 
     if (Auth::check()) { 
      $query->where('user_id', Auth::user()->id); 
     } 
    }]) 
    ->get(); 

そして、私のPost.phpモデルクラスは次のようになります。

class Post extends Model 
{ 
    public function comments() 
    { 
     return $this->hasMany('App\Comment'); 
    } 
} 

ユーザーがログインしているとき、クエリが正しい結果を返します

しかし、ユーザがでない場合、がログインしていれば、nを返す代わりにすべてのユーザのコメントを返しますothing(ユーザーはログインしているためコメントがありません)。

どうすればこの問題を解決できますか?

答えて

1

私はこれに考えることができる2つの方法があります。

まずユーザーがログインしている場合は、コメントだけをロードすることができます。

$posts = Post::select('posts.*'); 

if(Auth::check()) { 
    $posts->with(['comments' => function($query) { 
     $query->where('user_id', Auth::user()->id); 
    }]); 
} 

$posts = $posts->get(); 

それとも、すべてのコメントを読み込むことができますが、ユーザーがログインしていない場合はnullにuser_idを設定しているので、すべてのコメントがすべき。 have a user_idコメントは返されません。

$posts = Post::select('posts.*') 
    ->with(['comments' => function($query) { 
      $query->where('user_id', Auth::check() ? Auth::id() : null); 
    }]) 
    ->get(); 

2番目のコードはよりクリーンなIMOに見えますが、最初のコードは不要なクエリが実行されないようにします。

0

あなたがより読みやすく、実用的な、それを分離することができます:あなたのPostモデルで

$posts = Post::all(); 

をすべてのユーザーのコメントを返す関数を作成します。

public function userComments() 
{ 
    return $this->comments->where('user_id', Auth::user()->id); 
} 

と私はあなたが持っているあなたのビューを推測あなたがそれを行うことができますので、すべての投稿を繰り返すあなたのforeachの内側にあなたが投稿のコメントをロードするためのforeach:

@foreach($posts as $post) 
    $post->userComments() 
@endforeach 
+0

返す結果はAPI用であるため、ブレードビューは使用しません。そのため、結果を熱心に読み込む必要があります。 – user7863944

関連する問題