Запрос для получения всех сотрудников, которые не назначены на конкретную работу

Этот запрос должен выбрать сотрудников, чье имя или фамилия содержат строку $term, а затем также проверить, назначены ли эти сотрудники на работу, и вернуть только тех, кто не назначен на работу. Я использую сводную таблицу employee_job. Как бы то ни было, запрос возвращает даже тех сотрудников, которым уже назначен jobid и есть запись в сводной таблице.

 $employees = 
    Employee::where(function($query) use ($term) {
                    $query->where('firstname', 'LIKE', '%' . $term . '%')
                          ->orWhere('lastname', 'LIKE', '%' . $term . '%'); })
              ->whereHas('jobs', function($query) use ($jobid) { $query->where('jobs.id','!=',$jobid); })
              ->take(5)->get();

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

мне нужно что-то вроде этого

$query->where('jobs.id',$jobid)->count() == 0; 

person LaserBeak    schedule 30.04.2016    source источник


Ответы (1)


Вы ищете whereDoesntHave() вместо whereHas():

$employees = Employee::where(function($query) use ($term) {
        $query->where('firstname', 'LIKE', '%' . $term . '%')
            ->orWhere('lastname', 'LIKE', '%' . $term . '%');
    })
    ->whereDoesntHave('jobs', function($query) use ($jobid) {
        $query->where('jobs.id', $jobid);
    })
    ->take(5)
    ->get();

Это вернет сотрудников, у которых нет работы, соответствующей заданному идентификатору работы.

person patricus    schedule 30.04.2016
comment
Спасибо. Не было в базе данных: руководство по созданию запросов :( Наверное, нужно было посмотреть документацию по API - person LaserBeak; 30.04.2016
comment
@LaserBeak Да. Существует множество доступных функций, которых нет в общей документации. Рад, что это помогло. - person patricus; 30.04.2016