获得具有员工角色,名字或姓氏的用户的雄辩查询包含字符

时间:2016-04-27 10:44:48

标签: laravel eloquent

尝试获取所有员工,其名字或姓氏包含特定字符。

$users = User::whereHas('roles',function($query){ $query->where('title','Employee'); })->where('firstname','LIKE', '%'.$term.'%')->orWhere('lastname','LIKE','%'.$term.'%')->take(5)->get();

有一个将用户链接到角色的数据透视表:role_user

尝试上述操作后,它会返回包含要匹配的字符串的所有用户,而不仅仅是那些拥有'员工'作用。

2 个答案:

答案 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();