2017-04-13 66 views
0

我有一个Posts和一个Comments表,其中每个帖子可以有多个评论。仅当用户登录时才返回关系?

我想做一个查询,获取所有帖子,以及所有登录用户的评论。

这是我到目前为止有:

$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没有(因为用户登录,因此他们没有评论)。

我该如何解决这个问题?

回答

1

我可以通过两种方式来想到这一点。

首先,如果用户登录,你只能加载注释:

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

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

$posts = $posts->get(); 

或者你可以载入所有意见,但设置user_id为空,如果用户没有登录由于每个评论应该。有一个user_id没有评论将被返回。

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

在第二个代码看起来更清洁IMO,但第一个将阻止执行不必要的查询。

0

可以分开吧,更清晰和实用:

$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

相关问题