此查询需要选择名字或最后一个包含$ 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();
我可以告诉错误是因为它没有检查jobid的作业的计数是否为0,而是返回任何其他有jobid不匹配的工作的员工,即使他们有工作匹配jobid。
我需要这样的东西
$query->where('jobs.id',$jobid)->count() == 0;
答案 0 :(得分: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();
这将返回没有与给定职位相匹配的职位的员工。