我有一个帖子模型,一个用户模型和一个评论模型。
我的用户可以发帖,也可以发帖评论。
我想收到帖子的评论,但我的用户也可以阻止用户。
我的意思是,如果活跃用户有其他一些被阻止的用户,并且帖子的评论有这些用户创建的评论,我必须将其排除。
这就是问题所在。
$posts = $user()->posts()->get();
$blockedUserIdentifiers = (array) $viewer->getBlockedUserIdentifiers();
$posts->with(array('comments' => function($query) use ($blockedUserIdentifiers)
{
if( ! empty($blockedUserIdentifiers))
$query->whereNotIn('user_id', $blockedUserIdentifiers);
}))->with('user'); // ? Ups?
我想使用帖子和评论的关系,因为这里没有完成工作。但是如果我在posts数组上使用foreach,那么继续下去会非常奇怪;如果我在帖子对象上使用foreach,我很难继续。
因为我已经阻止了用户条件,所以我也不能急于加载。
我的案例的最佳做法是什么,或者我应该如何将$comments
结果对象添加到$posts
对象中,就像laravel一样?
或者我如何继续为该结果添加关系结果?
答案 0 :(得分:1)
使用with()
对多个关系施加约束。
$posts->with(array('comments' => function($query) use ($blockedUserIdentifiers)
{
// if( ! empty($blockedUserIdentifiers))
// $query->whereNotIn('user_id', $blockedUserIdentifiers);
}, 'comments.user', function($query) use ($blockedUserIdentifiers)
{
// Constraints on the users can go here
if( ! empty($blockedUserIdentifiers))
$query->whereNotIn('id', $blockedUserIdentifiers);
}))->get();
或者回音时这样做。
foreach($posts as $post) {
// If you want to keep your relationships clean, you can just not echo the post instead
if(array_search($post->user_id, $blockedUserIdentifiers) !== false) {
continue;
}
echo $post->content;
foreach($post->comments as $comment) {
echo $comment->user;
echo $comment->content;
}
}