在Eloquent ORM查询中排除枢轴行

时间:2015-10-15 20:49:17

标签: laravel orm eloquent

(laravel 4.2)

涉及四个表格;用户,帖子,标志和post_flags。

我想检索某个用户拥有的每个帖子,并检索为帖子设置的标志,但只检索相关用户设置的标志。

例如:一个帖子可以有标志:1,2,2,3其中标志2被设置两次。一次是用户A,一次是用户B.我不想看到用户B设置的标志。

我的控制器中的Eloquent查询:

$posts = Post::whereHas('companies', function($q) use($company_id) {
        $q->where('id', '=', $company_id);
    })->with('flags')->get();

我的帖子模型中的关系:

public function flags() {
    return $this->belongsToMany('PostFlag', 'post_postflags', 'post_id', 'flag_id')
    ->withTimestamps()->withPivot('owner');
}

如何使用Eloquent ORM实现这一目标?

更新

我的最后一个问题,感谢andrewtweber:

最终查询

$posts = Post::whereHas('users', function($q) use($id) {
            $q->where('id', '=', $id);
         })->get()->load([
            'flags' => function($query) use($id) {
                $query->where('owner', '=', $id)->orWhere('owner', '=', 'SYSTEM');
            }
         ]);

1 个答案:

答案 0 :(得分:1)

使用wherePivot

http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Relations/MorphToMany.html

$flags = $post->flags()
    ->wherePivot('user_id', '=', $user_id)
    ->get();

或急切加载

$posts->load([
    'flags' => function ($query) use($user_id) {
        $query->wherePivot('user_id', '=', $user_id);
    }
]);