2016-11-06 79 views
3

情景匹配阵列从枢轴表

我有3页主要的表EmployeesJobsSkillsEmployeesJobsmany-to-manySkills的关系表。

因此,员工可以拥有技能1,2,3,5。 A job可能需要skills1,3,5

现在我的问题是我如何在一个雄辩的查询中匹配id。就像,如果我想搜索所有employeesjob需要skills 1,3,5,它应该搜索所有employees具有所有这些skills(1,3,5)

回答

2

你说你有一组ID,所以使用多个whereHas()

$employees = Employee::JobLocations($jobZipId); 

foreach ($skillIds as $id) { 
    $skilledEmployees = $emloyees->whereHas('skills', function ($q) use ($id) {  
     $q->where('id', $id); 
    }); 
} 

$skilledEmployees = $skilledEmployees->get(); 
+0

现在它不返回任何记录。我找到了另一种匹配ID的方法。拉动记录后,我可以匹配count(array_intersect(array_unique($ employeeSkillIds),$ jobSkillIds))== count($ jobSkillIds);'但这看起来不太好,如果我可以执行在口头上同样的任务。 – shoieb0101

+0

我需要修改代码http://pastie.org/10956748。你可以请更新你的答案,我会接受它。万分感谢! – shoieb0101

+0

@ shoieb0101,在你的代码中你有3个变量($ employees,$ allEmployees,$ testEmployees)。你确定在那些?你能检查一下吗? –

0

你可以不喜欢它,我正在$job作为一个已定义的对象。

Employee::whereHas('skills', function($q) use($job) { 
    $q->whereIn('id', $job->skills->lists('id')->toArray()); 
})->get(); 

更新

在Laravel 5.3及以上的情况下,lists将无法​​正常工作(因为其被删除),所以该方法也可以用pluck方法,而不是lists

希望这可以帮助你解决你的问题。

+1

我试图像之前,但它不匹配的ID阵列,它只是匹配从job_skill IDS和employee_skills单个项目返回true。我只需要在'$ employee-> skills-> lists('id') - > toArray()'中的所有id都出现在$ employee-> skills-> lists('id') - >指定者()'。 – shoieb0101

+0

我正在使用5.2并且获取数组中的'ids'不是问题。 – shoieb0101

+0

我认为whereIn将比较所有使用'和'运算符比较作为参考请参阅此 - https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_whereIn –