2016-11-06 4 views
3

シナリオ一致アレイ

I 3つのメインテーブルEmployeesJobsSkillsを有します。 EmployeesおよびJobsSkillsテーブルとmany-to-manyの関係にあります。

従業員はスキルを持つことができます1,2,3,5jobは、skills1,3,5を必要とする場合があります。

私の質問は、どのように雄弁なクエリでIDの一致することができます。私はskills 1,3,5を必要とjobためのすべてのemployeesを検索する場合と同様に、それはあなたが好き、私はすでに定義されたオブジェクトとして$jobそれを取っていないことができるすべてのものをskills(1,3,5)

答えて

2

あなたはIDの配列を持っているので、複数のwhereHas()使用言った:私は前にそのようにしようとしたが、それはIDの配列と一致していない、それだけでjob_skill IDを持つemployee_skillsから単一の項目に一致する

$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_unique($ employeeSkillIds)、$ jobSkillIds))== count($ jobSkillIds); 'とマッチすることができますが、これはうまく見えません。雄弁の中で同じ仕事。 – shoieb0101

+0

私はコードを少し修正する必要があったhttp://pastie.org/10956748。あなたはあなたの答えを更新していただけますか?私はそれを受け入れます。ありがとう、トン! – shoieb0101

+0

@ shoieb0101、コードに3つの変数($ employees、$ allEmployees、$ testEmployees)があります。それらは確かですか?これを確認してください。 –

0

を持つすべてのemployeesを検索する必要があります。

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

更新

Laravel 5.3とアップの場合は、(そのが除去される)方法listsは動作しませんので、あなたはまた、代わりにlistspluck方法を使用することができます。

これは、あなたの問題を解決するのに役立ちます。

+1

をし、 trueを返します。 '$ job-> skills-> lists( 'id') - > toArray()'のすべてのidが$ employee-> skills-> lists( 'id') - > toArray() ' – shoieb0101

+0

私は5.2を使用していて、 'ids'を配列に入れても問題ありません。 – shoieb0101

+0

私はwhereInが 'と'演算子の比較を使用してそれらをすべて比較すると思うのですが参考にしてください - https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_whereIn –