我有三个表user
,role
,permission
,user
hasMany role
,role
hasMany permission
,I想找出我有权限的用户,因此我使用whereHas
$user = User::whereHas('roles', function($q) {
$q->whereHas('permissions', $function($q) {
$q->where('name', $value);
});
});
结果是正确的,但如果我想通过更多条件搜索用户,我会给出其他权限值并使用orWhere
,它会响应所有拥有任何权限的用户,如何修复它?
$user = User::whereHas('roles', function($q) {
$q->whereHas('permissions', $function($q) {
$q->where('name', $value)->orWhere('name', $value2);
});
});
答案 0 :(得分:5)
我遇到了同样的问题:我想实现对公司的表搜索。搜索字符串应在公司名称内搜索,也应在相关联系人的姓名和姓氏中搜索。我的尝试是这样的:
Company::where('name', 'like', '%'.$searchstring.'%')
->orWhereHas('contacts', function($q) use ($searchstring) {
$q->where('forename', 'like', '%'.$searchstring.'%')
->orWhere('lastname', 'like', '%'.$searchstring.'%');
});
结果类似于您所描述的结果:对于某些搜索字符串,所有公司都被退回。
我唯一能解决的办法就是将orWhereHas-closure的where和orhere分成两个或者哪些闭包。像这样:
Company::with('mainContact', 'contacts')
->where('name', 'like', '%'.$searchstring.'%')
->orWhereHas('contacts', function($q) use ($searchstring) {
$q->where('forename', 'like', '%'.$searchstring.'%');
})
->orWhereHas('contacts', function($q) use ($searchstring) {
$q->where('lastname', 'like', '%'.$searchstring.'%');
});
我不确定这是否会产生非常昂贵的SQL查询,但它确实有效。我的代码片段的任何改进都非常受欢迎。
答案 1 :(得分:0)
避免在第一个 中使用 $ q 变量
User::has('roles')->whereHas('permissions', $function($q) {
$q->where('name', $value)->orWhere('name', $value2);
});