Мне интересно, как выполнить запрос вложенных отношений с ограничениями в Laravel 4.1.Laravel ORM вложенные отношения с ограничениями
Вот ссылка запрос, который работает:
$users = User::with("careers.specialty.faculty.university")->get();
Как вы можете видеть, есть несколько вложенных моделей (с различными типами отношения).
Я хотел бы, чтобы загрузить дополнительное ограничение на одну или несколько моделей, например, имя факультета ...
Что бы лучший (и самый простой) способ достижения этой цели?
Вот что я пробовал до сих пор, но кажется, что ограничения не принимаются во внимание (все пользователи возвращаются).
$users = User::with([
'careers'=> function($query)use($levelInput){
if ($levelInput ==""){
$query->get();
}else{
$query->where('level','=',$levelInput)->get();
}
},
'careers.specialty'=> function($query)use($specialtyInput){
if ($specialtyInput ==""){
$query->get();
}else{
$query->where('name','like','%'.$specialtyInput.'%')->get();
}
},
'careers.specialty.faculty'=> function($query)use($facultyInput){
if ($facultyInput ==""){
$query->get();
}else{
$query->where('name','like','%'.$facultyInput.'%')->get();
}
},
'careers.specialty.faculty.university'=> function($query)use($universityInput){
if ($universityInput ==""){
$query->get();
}else{
$query->where('name','like','%'.$universityInput.'%')->get();
}
}
])->get();
EDIT: Вот решение, благодаря принятому ответу Максима Cierzniak в:
$users = User::whereHas('promos',function($q)use($levelInput,$specialtyInput,$facultyInput,$universityInput){
$q->where('level','like','%'.$levelInput.'%')->whereHas('specialty',function($q)use($specialtyInput,$facultyInput,$universityInput){
$q->where('name','like','%'.$specialtyInput.'%')->whereHas('faculty',function($q)use($facultyInput,$universityInput){
$q->where('name','like','%'.$facultyInput.'%')->whereHas('universities',function($q)use($universityInput){
$q->where('name','like','%'.$universityInput.'%');
});
});
});
})->get();
Ну, этот код выглядит очень некрасиво. Но он работает, и если у вас есть лучший вариант, не стесняйтесь делиться им :)