【发布时间】:2014-12-13 13:20:31
【问题描述】:
我一直在学习 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;
它正在工作,你可以看到here。
我把它转换成:
$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 以及如何转换?
- 当我说更简单时,我的意思是更易读、更独立、更正确,而不是那种大查询。
【问题讨论】:
标签: php laravel eager-loading