1

このクエリは、名前または姓に $term 文字列が含まれる従業員を選択する必要がありますが、それらの従業員が既にその仕事に割り当てられているかどうかもチェックし、その仕事に割り当てられていない従業員のみを返します。employee_job ピボット テーブルを使用しています。そのままで、クエリは、ジョブ ID に既に割り当てられていて、ピボット テーブルにレコードがある従業員も返します。

 $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();

エラーは、jobid を持つジョブのカウントが 0 であるかどうかをチェックせず、jobid に一致するジョブがある場合でも、jobid が一致しない他のジョブを持つ従業員を返すためであることがわかります。 .

私はこのようなものが必要です

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

1 に答える 1

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

これは、指定されたジョブ ID に一致するジョブを持たない従業員を返します。

于 2016-04-30T04:55:59.323 に答える