Laravel 4(.1),雄辩和关系

时间:2014-02-03 10:19:58

标签: php orm laravel laravel-4 eloquent

我有一个帖子模型,一个用户模型和一个评论模型。

我的用户可以发帖,也可以发帖评论。

我想收到帖子的评论,但我的用户也可以阻止用户。

我的意思是,如果活跃用户有其他一些被阻止的用户,并且帖子的评论有这些用户创建的评论,我必须将其排除。

这就是问题所在。

$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一样?

或者我如何继续为该结果添加关系结果?

1 个答案:

答案 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;
    }
}