Laravel Где там, где есть

Есть ли способ вернуть родительскую модель с отношениями, но только некоторые строки отношений, используя 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-файл комнат. Комнаты можно выбрать, установив флажок рядом с комнатой в списке комнат. Затем мне нужно передать массив идентификаторов комнат и получить все здания, в которых есть одна из комнат. Затем получите все комнаты для каждого здания, где идентификатор комнаты находится в массиве.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 849
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

вы можете сделать это с помощью следующего кода:

$ids = explode(',',$request->input('ids'));
$buildings = Buildings::whereHas('rooms', function($q) use ($ids) {
    $q->whereIn('id', $ids);
})->get();

Надеюсь это поможет.

Это не работает, это все равно возвращает каждую комнату для сайта, при условии, что у сайта есть комната с идентификатором, который находится в массиве

S_R 10.09.2018 17:22

Вы можете загрузить дочернее отношение и получить здания из коллекции комнат:

$buildings = Room::with('building')
    ->with('building.room')
    ->whereIn('id', $ids)
    ->get()
    ->pluck('building');

Чтобы это работало, вам необходимо, чтобы отношение было объявлено в моделях Building и Room.

Потому что мне нужно запустить foreach для зданий, а затем foreach для каждой комнаты в зданиях. Здания должны быть родительскими.

S_R 10.09.2018 17:25

Один из других ответов решил мою проблему, хотя спасибо за вашу помощь и предложение!

S_R 10.09.2018 17:36
$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.

Великолепно, в этом есть смысл! Спасибо

S_R 10.09.2018 17:36

Другие вопросы по теме