2014-12-13 51 views
0

我一直在傾斜Laravel並試圖實現一些東西,但是我的確很成功,但我聽說可以使用Eager Loading以更簡單的方式執行相同的操作。將Laravel查詢轉換爲Eager正在加載

想象一下,我們有4個表格:garages,cars,securities, places

garages在這裏你可以找到carssecurities是保持那車車庫內的安全保障,places在這裏你可以找到類似的一個車庫。

我想是列出garages並加入三個表是carssecuritiesplaces這樣的:

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(); 

正如我前面所說,它的工作,但我不知道是否有這樣做的使用預先加載以及如何轉換更簡單的方法?

  • 當我說越容易,我的意思是更可讀,分開,正確的方式,而不是那個大的查詢。

回答

3

假設你有4個實體的Eloquent Model類。 如果是這種情況,您可以嘗試通過Eloquent ORM進行加載。

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

然後只要你喜歡使用返回結果集,它是一個集合(照亮的\ Support \收藏),你可以準備好所需的輸出。您可以按照自己喜歡的方式轉換集合中的項目。這是一個例子。

就你而言,我認爲這將是實現它的方法。

$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

+0

它返回'cars'和'places'但是'securities'的總數仍然總是0. – yayuj 2014-12-14 01:58:09

+0

我用'hasManyThrough'自己解決了它。 - 但是現在,當我將數組傳遞給刀片模板時,出現錯誤:「嘗試獲取非對象的屬性」。如何解決這個問題? – yayuj 2014-12-14 02:41:03

+0

嘗試通過對象集合進行調試以查看關係是否已加載,錯誤告訴您無論您嘗試獲取的object->屬性在對象上都不可用。 – Raftalks 2015-01-12 13:20:39