尝试获取所有员工,其名字或姓氏包含特定字符。
$users = User::whereHas('roles',function($query){ $query->where('title','Employee'); })->where('firstname','LIKE', '%'.$term.'%')->orWhere('lastname','LIKE','%'.$term.'%')->take(5)->get();
有一个将用户链接到角色的数据透视表:role_user
尝试上述操作后,它会返回包含要匹配的字符串的所有用户,而不仅仅是那些拥有'员工'作用。
答案 0 :(得分:1)
在您的查询中,您添加了一个orWhere(),它会禁用第一个位置,因此它会对角色和拳头名称进行过滤,或仅对姓氏进行过滤。
你应该拥有的是:
User::whereHas('roles', function($query) {
$query->where('roles.title', 'Employee');
})->where('firstname', 'LIKE', '%' . $term . '%')
->orWhereHas('roles', function($query) {
$query->where('roles.title', 'Employee');
})->where('lastname', 'LIKE', '%' . $term . '%')
->get();
您也可以这样写:
User::where(function($query) use ($term) {
$query->where('firstname', 'LIKE', '%' . $term . '%')
->orWhere('lastname', 'LIKE', '%' . $term . '%');
})->whereHas('roles', function($query) use ($term) {
$query->where('roles.title', 'Employee');
});
答案 1 :(得分:0)
这似乎可以完成工作,是迄今为止我提出的最紧凑,最有效的查询。
$users = User::join('role_user','users.id', '=', 'role_user.user_id')
->join('roles', function($join) { $join->on('role_user.role_id','=' ,'roles.id')
->where('roles.title','=','Employee'); })
->where('firstname','LIKE', '%'.$term.'%')
->orWhere('lastname','LIKE','%'.$term.'%')->take(5)->get();