我一直在傾斜Laravel並試圖實現一些東西,但是我的確很成功,但我聽說可以使用Eager Loading以更簡單的方式執行相同的操作。將Laravel查詢轉換爲Eager正在加載
想象一下,我們有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();
正如我前面所說,它的工作,但我不知道是否有這樣做的使用預先加載以及如何轉換更簡單的方法?
- 當我說越容易,我的意思是更可讀,分開,正確的方式,而不是那個大的查詢。
它返回'cars'和'places'但是'securities'的總數仍然總是0. – yayuj 2014-12-14 01:58:09
我用'hasManyThrough'自己解決了它。 - 但是現在,當我將數組傳遞給刀片模板時,出現錯誤:「嘗試獲取非對象的屬性」。如何解決這個問題? – yayuj 2014-12-14 02:41:03
嘗試通過對象集合進行調試以查看關係是否已加載,錯誤告訴您無論您嘗試獲取的object->屬性在對象上都不可用。 – Raftalks 2015-01-12 13:20:39