2016-04-27 2 views
2

Попытка получить всех пользователей, которые являются сотрудниками и чье имя или фамилия содержат определенные символы.Запрошенный запрос, чтобы получить пользователей, у которых есть роль сотрудника и имя или фамилия, содержит символы

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

Существует сводной таблицы связывания пользователей с ролями: role_user

Пробовал вышеизложенное, однако возвращает всех пользователей, которые содержат строку, чтобы соответствовать, а не только те, которые имеют роль «Сотрудник».

ответ

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'); 
}); 
+0

Я использую сводную таблицу. На самом деле у меня нет внешнего ключа role_id для модели пользователя – LaserBeak

+0

Это редактирование должно работать ;-) –

+0

Да, работает. Хотя приведенный ниже пример соединения выглядит немного более эффективным. Интересно, почему требуется предложение orWhereHas и выполняет ту же логику фильтрации, что и первая WhereHas – LaserBeak

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(); 
Смежные вопросы