2016-11-06 2 views
3

SzenarioSpiel Array von IDs von Pivot-Tabelle

Ich habe 3 Haupttabellen Employees, Jobs, Skills. Employees und Jobs hat many-to-many Beziehung mit Skills Tabelle.

So kann ein Mitarbeiter Fähigkeiten haben 1,2,3,5. A job kann erfordert skills1,3,5.

Jetzt ist meine Frage, wie kann ich die IDs in einer eloquenten Abfrage übereinstimmen. Wie, wenn ich die ganze employees für eine job erfordern skills 1,3,5 suchen möchten, sollte es durchsuchen die employees alle mit skills(1,3,5)

Antwort

2

Sie sagten, Sie eine Reihe von IDs haben, so verwenden mehrere 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

Jetzt gibt es keine Datensätze zurück. Ich finde einen anderen Weg, um die IDs anzupassen. Nachdem ich die Datensätze gezogen habe, kann ich mit 'count (array_intersect (array_unique ($ employeeSkillIds), $ jobSkillIds)) == count ($ jobSkillIds); 'aber das sieht nicht gut aus und es wäre toll, wenn ich das ausführen könnte gleiche Aufgabe innerhalb eloquent. – shoieb0101

+0

Ich musste den Code ein bisschen ändern http://pastie.org/10956748. Können Sie bitte Ihre Antwort aktualisieren und ich akzeptiere sie. Danke vielmals! – shoieb0101

+0

@ shoieb0101, in Ihrem Code haben Sie 3 Variablen ($ Mitarbeiter, $ allEmployees, $ testEmployees). Bist du sicher darin? Könnten Sie das bitte überprüfen? –

0

Sie können es tun, wie ich $job wie bereits ein definiertes Objekt nehme.

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

aktualisieren

Bei Laravel 5.3 und höher, das Verfahren lists nicht funktionieren (wird als entfernt), so können Sie auch pluck Methode anstelle von lists verwenden.

Hoffe das hilft Ihnen, Ihr Problem zu lösen.

+1

ich so vorher versucht, aber es funktioniert nicht Array von IDs übereinstimmen, es passt nur ein einzelnes Element aus employee_skills mit job_skill ids und gibt wahr zurück. Ich muss nur dann true zurückgeben, wenn alle IDs in '$ job-> skills-> lists ('id') -> toArray()' in '$ employee-> skills-> lists ('id') -> vorhanden sind toArray() '. – shoieb0101

+0

Ich benutze 5.2 und die 'ids' in einem Array ist kein Problem. – shoieb0101

+0

Ich denke, whereIn wird alle vergleichen mit ihnen und 'Operator Vergleich als Referenz siehe diese - https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_whereIn –