2016-11-06 81 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 –