Конвертировать запрос Laravel в Eager Загрузка

Я опирался на Laravel и пытался реализовать что-то, и я это сделал, это сработало, но я слышал, что возможно сделать то же самое проще с помощью Eager Loading.

Представьте, что у нас есть 4 таблицы: garages, cars, securities, places,

garages где вы можете найти cars, securities это безопасность, которая хранит эту машину в гараже, и places Здесь вы можете найти гаражи, похожие на этот.

Что я хочу это список garages и присоединиться к трем таблицам cars, securities а также places как это:

Garage 1 has 2 cars with 3 securities and has 3 more garages similar
Garage 2 has 1 cars with 1 securities and has 2 more garages similar

И вот запрос:

select
g.garage_name,
count(distinct c.car_id) as count_cars,
count(distinct s.security_id) as count_securities,
count(distinct p.place_id) as count_places
from garages g
left join cars c on c.garage_id = g.garage_id
left join securities s on s.car_id = c.car_id
left join places p on p.garage_id = g.garage_id
group by g.garage_name
order by g.garage_name;

Это работает, как вы можете видеть Вот.

Я преобразовал это в:

$garages = Garages::select('garage_name',
DB::raw('count(distinct cars.car_id) as count_cars'),
DB::raw('count(distinct securities.security_id) as count_securities'),
DB::raw('count(distinct places.place_id) as count_places'))
->leftJoin('cars', 'cars.garage_id', '=', 'garages.garage_id')
->leftJoin('securities', 'securities.car_id', '=', 'cars.car_id')
->leftJoin('places', 'places.garage_id', '=', 'garages.garage.id')
->groupBy('garages.garage_name')
->orderBy('garages.garage_name')
->get();

Как я уже говорил выше, это работает, но мне интересно, есть ли более простой способ сделать это с помощью Eager Loading и как конвертировать?

  • Когда я говорю проще, я имею в виду более читаемый, разделенный, правильный путь вместо этого большого запроса.

0

Решение

Допустим, у вас есть 4 класса Eloquent Model для сущностей.
Если это так, вы можете попытаться загрузить через Eloquent ORM.

$Garages = Garage::with(['cars','places', 'securities'])->get();

Затем вы можете подготовить необходимые выходные данные, как вам нравится, используя возвращенный набор результатов, который является коллекцией (Illuminate \ Support \ Collection). Вы можете преобразовать элементы в коллекции любым удобным вам способом. Вот пример.

В вашем случае, я предполагаю, что это будет способ сделать это.

$Garages->transform(function($garage) {
return array(
'garage_name' => $garage->garage_name,
'count_cars' => $garage->cars->count(),
'count_securities' => $garage->securities->count(),
'count_places' => $garage->places->count(),
// add as many custom details you want here
);
});

return $Garages->toArray(); // see the output

Теперь я надеюсь, что у вас есть идея.

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

class Garage extends Eloquent {

public function cars() {
return $this->hasMany('Car');
}

public function securities()
{
return $this->hasMany('Security');
}

public function places()
{
return $this->hasMany('Place');
}

}

class Car extends Eloquent {

// relationships here
}

class Security extends Eloquent {

// relationships here
}

class Place extends Eloquent {

// relationships here
}

Это простой пример, который поможет вам понять.

Наслаждайтесь ! : D

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]