Я опирался на 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 и как конвертировать?
Допустим, у вас есть 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
Других решений пока нет …