2016-04-30 81 views
1

此查询需要选择名字或最后一个包含$ 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(); 

我可以告诉错误是因为它不检查是否与作业ID计数的工作是0,而返回其有任何其他的工作在作业ID不匹配任何员工,即使他们有一份与jobid匹配的工作。

我需要的是这样的

$query->where('jobs.id',$jobid)->count() == 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(); 

这将返回没有工作给定的工作相匹配的员工ID。

+0

谢谢。不在数据库中:查询生成器指南:(可能应该查看API文档 – LaserBeak

+0

@LaserBeak是的。有大量的函数不在通用文档中,很高兴帮助。 – patricus

相关问题