我有一个雄辩的查询,我没有得到预期的结果,我希望有人可以向我解释编写查询的正确方法。
我有三张桌子:
records (belongsToMany users)
users (belongsToMany records)
record_user (pivot)
record_user
表格还有role
列。
我尝试获取用户拥有role
或singer
的{{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
的约束 - 使用雄辩语法编写此函数的正确方法是什么?
答案 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();