Есть ли способ вернуть родительскую модель с отношениями, но только некоторые строки отношений, используя where in?
Это может сбивать с толку, позвольте мне объяснить.
На данный момент у меня есть 2 модели, здания и комнаты, в одном здании может быть много комнат.
Я хочу иметь возможность передавать массив идентификаторов комнат и возвращать сайты и только те комнаты, которые находятся в массиве.
Вот что у меня есть на данный момент
if ($request->input('ids') && !is_null($request->input('ids'))){
$ids = explode(',',$request->input('ids'));
//Exploded ids looks like this "2,4,11,55,56"
$buildings = Buildings::join('rooms')->whereIn('rooms.id',$ids)->get();
} else {
$buildings = Buildings::whereHas('rooms')->get();
}
На данный момент это вернет все здания, у которых есть комната, идентификатор которой находится в массиве ids, и все его комнаты, что в конечном итоге вернет здание с более чем 200 комнатами. Мне нужно вернуть здание и ТОЛЬКО комнаты, у которых есть идентификатор в этом массиве.
Это возможно?
Я знаю, что могу сделать это наоборот и получить все комнаты в качестве родителя, а затем получить здания, но мне нужно, чтобы здания были родительскими, поскольку я запускаю такой foreach с результатами
foreach($buildings as $key => $building){
<h1>{{$building->name}}</h1>
foreach($building->rooms as $k => $room){
<p>{{$room->name}}</p>
}
}
Если это все еще сбивает с толку, в реальном мире я создаю PDF-файл комнат. Комнаты можно выбрать, установив флажок рядом с комнатой в списке комнат. Затем мне нужно передать массив идентификаторов комнат и получить все здания, в которых есть одна из комнат. Затем получите все комнаты для каждого здания, где идентификатор комнаты находится в массиве.






вы можете сделать это с помощью следующего кода:
$ids = explode(',',$request->input('ids'));
$buildings = Buildings::whereHas('rooms', function($q) use ($ids) {
$q->whereIn('id', $ids);
})->get();
Надеюсь это поможет.
Вы можете загрузить дочернее отношение и получить здания из коллекции комнат:
$buildings = Room::with('building')
->with('building.room')
->whereIn('id', $ids)
->get()
->pluck('building');
Чтобы это работало, вам необходимо, чтобы отношение было объявлено в моделях Building и Room.
Потому что мне нужно запустить foreach для зданий, а затем foreach для каждой комнаты в зданиях. Здания должны быть родительскими.
Один из других ответов решил мою проблему, хотя спасибо за вашу помощь и предложение!
$ids = explode(',',$request->input('ids'));
$building_ids = Room::whereIn('id',$ids)->pluck('building_id');
$buildings_with_specific_rooms = Building::join('rooms', 'buildings.id', '=', 'rooms.building_id')->select('buildings.name', 'rooms.name')->whereIn('buildings.id', $building_ids)->whereIn('rooms.id', $ids)->get();
надеюсь, это поможет вам.
Сначала вам нужно знать, что whereHas фильтрует только ваш родительский результат, но не отношение нетерпеливой загрузки. Так что вам нужно применить этот фильтр и при активной загрузке. Нравится
$ids = explode(',',$request->input('ids'));
$buildings = Buildings::with(['rooms' => function($q) use ($ids) {
$q->whereIn('id', $ids);
}])->whereHas('rooms', function($q) use ($ids) {
$q->whereIn('id', $ids);
})->get();
Здесь фильтрующие здания whereHas и помещения с фильтрами with.
Великолепно, в этом есть смысл! Спасибо
Это не работает, это все равно возвращает каждую комнату для сайта, при условии, что у сайта есть комната с идентификатором, который находится в массиве