仅当父表中的字段为true时才加载关系

时间:2016-11-26 09:18:26

标签: eloquent laravel-5.2

我有一个名为Post的父表,它有一个名为is_anonymous的布尔列。 Post表与Users表有关系。我想仅在is_anonymous设置为false时加载此关系。有没有办法实现这个目标?

以下关系为用户提供了所有帖子。

$institute = Institute::where('inst_id', '=', $institute_id)->with(
        ['posts' => function ($posts) {
            $posts->with(['user', 'tags']);
        }]
    )->orderBy('created_at', 'DESC')->skip($skip)->take(10)->get();

1 个答案:

答案 0 :(得分:0)

我最终使用延迟加载来解决这个问题。我认为没有其他方法可以做到这一点。如果您找到更好的方法,请添加答案。

$posts = Institute::where('inst_id', '=', $institute_id)->first()->posts()->with('tags')
        ->orderBy('created_at', 'DESC')->skip($skip)->take(10)->get();

foreach ($posts as $post) {
    if (!$post['is_anonymous']) {
        $post->load('user');
    }
}

或者,

为了提高性能,我目前正在使用以下查询解决此问题并删除关键用户,因为迭代10个项目的列表并且删除总是比进行10次查询(最坏情况)

$posts = Institute::where('inst_id', '=', $institute_id)->first()->posts()->with(['user', 'tags'])
    ->orderBy('created_at', 'DESC')->skip($skip)->take(10)->get();

foreach ($posts as $post) {
    if ($post['is_anonymous']) {
       unset($post['user'])
    }
}