2014-12-28 18 views
5

Mam 2 tabele, użytkowników i umiejętności oraz wiele do wielu relacji między nimi. Tabela przestawna skill_user ma również kolumnę "level" - na jakim poziomie ten użytkownik zna tę umiejętność.Laravel wiele do wyboru z Eloquent

w modelu użytkownika mam:

public function skills(){ 
    return $this->belongsToMany('Skill')->withPivot('level'); 
} 

aw modelu mistrzostwo:

public function users(){ 
    return $this->belongsToMany('User'); 
} 

Teraz trzeba uruchomić kwerendę, która zwróci coś takiego:

„Wybierz wszyscy użytkownicy, którzy mają skill_id_1> 40 & & skill_id_2> 55 & & skill_id_3> 67 "

gdzie skills_ids są różnymi umiejętnościami, a każdy użytkownik powracający powinien posiadać każdą z wymaganych umiejętności na wymaganym poziomie.

Szukałem w dokumentacji Laravel i w stackoverflow tyle, ile mogłem, ale nie mogłem znaleźć rozwiązania. Każda pomoc będzie doceniona, dzięki!

+0

Powinieneś raczej wyjaśnić to lepiej. Jakie masz tabele i jak zdobyć skill_id_1. W tej chwili niezbyt jasne jest, że –

+0

skill_id_1 i skill_id_2 to tylko zmienne, będą rzeczywiste identyfikatory, na przykład: "Wybierz wszystkich użytkowników, którzy mają php (z id = 1)> 40 && mysql (id = 2)> 55" –

Odpowiedz

5

To, czego potrzebujesz, to whereHas. Wiele z nich.

$users = User::whereHas('skills', function($q){ 
    $q->where('skill_id', 1); 
    $q->where('level', '>', 44); 
})->whereHas('skills', function($q){ 
    $q->where('skill_id', 2); 
    $q->where('level', '>', 55); 
})->whereHas('skills', function($q){ 
    $q->where('skill_id', 3); 
    $q->where('level', '>', 67); 
})->get(); 

Jestem przy założeniu wartości są dynamiczne, więc to powinno uprościć to dużo:

$requirements = array('1' => 40, '2' => 55, '3' => 67); 

$users = User::query(); 
foreach($requirements as $id => $value){ 
    $users->whereHas('skills', function($q) use ($id, $value){ 
     $q->where('skill_id', $id); 
     $q->where('level', '>', $value); 
    }); 
} 
$users = $users->get(); 
+1

lepiej niż miałem nadzieję, dzięki! –

Powiązane problemy