Laravel Eloquent或WherePivot没有返回预期结果

时间:2015-10-26 19:10:20

标签: laravel eloquent

我有一个雄辩的查询,我没有得到预期的结果,我希望有人可以向我解释编写查询的正确方法。

我有三张桌子:

records (belongsToMany users)
users (belongsToMany records)
record_user (pivot)

record_user表格还有role列。

我尝试获取用户拥有rolesinger的{​​{1}}的所有记录:

songwriter

下面是如何生成SQL语法:

$results = User::find(Auth::user()->id)
                    ->records()
                    ->wherePivot('role', 'singer')
                    ->orWherePivot('role', 'songwriter')
                    ->get();

select `records`.*, `record_user`.`user_id` as `pivot_user_id`, `record_user`.`record_id` as `pivot_record_id` from `records` inner join `record_user` on `records`.`id` = `record_user`.`property_id` where `record_user`.`user_id` = '1' and `record_user`.`role` = 'singer' or `record_user`.`role` = 'songwriter' 角色的结果是预期的:用户是歌手的所有记录。问题是singer的结果:我收到所有词曲作者,查询不受songwriter约束。出于某种原因,我期望user_id角色也受到songwriter的约束 - 使用雄辩语法编写此函数的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

嗯..我认为你需要使用一个高级的where子句。

$results = Auth::user()
            ->records()
            ->where(function($query) {
                $query->where('record_user.role', '=', 'singer')
                      ->orWhere('record_user.role', '=', 'songwriter');
            })
            ->get();

答案 1 :(得分:1)

这是Laravel问题。就我而言,我可以这样解决:

$results = Auth::user()
                 ->records()
                 ->wherePivot('role', 'singer')
                 ->orWherePivot('role', 'songwriter')
                 ->where('user_id', Auth::id())
                 ->get();

或使用Advance where子句

答案 2 :(得分:0)

如果你想要获得记录,我会做类似的事情:

User::find(Auth::user()->id)
    ->records()
    ->where(function($q){
        $q->where('records.role', 'singer')
            ->orWhere('records.role', 'songwriter');
    })->get();