Laravel Где В на Где Есть - PullRequest
       7

Laravel Где В на Где Есть

0 голосов
/ 10 сентября 2018

Есть ли способ вернуть родительскую модель с отношением, но вернуть только некоторые строки отношения, используя where in?

Это может быть довольно запутанным, позвольте мне объяснить.

На данный момент у меня есть 2 модели, Здания и комнаты, в 1 здании может быть много комнат.

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

Вот что у меня есть на данный момент

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

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Во-первых, вам нужно знать, 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 фильтровальные комнаты.

0 голосов
/ 10 сентября 2018

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

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

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

0 голосов
/ 10 сентября 2018
$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();

надеюсь, это поможет вам.

0 голосов
/ 10 сентября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...