2015-12-04 90 views
1

道歉,如果標題沒有多大意義,但這裏是我得到了什麼,我想達到什麼。Eloquent/Laravel:嵌套懶惰渴望加載,但返回多個模型的關係

有一個餐廳的菜單,它的結構是這樣的:

Restaurant 
|- category 1 
    |- subcategory 1 
    |- subcategory 2 
     |- item 1 
     * price levels: 
     |- price level 1 
     |- price level 2 
     * modifiers groups: 
     |- group 1 
      |- modifier 1 
      |- modifier 2 

的目標是編寫最有效的方式(在數據庫查詢的條件),以獲得整個菜單(通過API擔任JSON) ,但有一個問題:我需要價格水平和每個項目的修飾符。

,我想出了最有效的方法是:1

部分:鏈一路攀升到項目的修飾符(因爲他們比價格水平多個嵌套):

$this->restaurant->load('categories.subcategories.items.modifier_groups_enabled.modifiers_enabled'); 

部分2: 在通過類別/子類別/項目開始循環之前,我「手動」獲取屬於餐廳中所有項目的所有價格級別,然後將它們放入數組中,並按項目的ID進行分組。然後,在菜單中循環時,我只需將$price_levels[$item->id]作爲一個項目的價格水平數組。

沒有緩存,整個請求在7個查詢,這是確定完成,但準備物價水平的「骯髒」的方法是困擾我有點:)

如果我切嵌套預先加載瞭然後獲取每個項目的價格水平和修飾符($item->load[...]),由於每個項目都運行自己的項目以獲取價格水平和修飾符組/修飾符,因此數據庫查詢會累積。

所以,問題是:$this->restaurant->load('...')可以這樣寫:它也返回所有物品的價格水平和修飾符?

回答

1

所以,問題是:$ this-> restaurant-> load('...')是否可以這樣寫:它也返回所有項目的價格水平和修飾符?

當然,只是指定的價格水平相同的方式修改組:

$this->restaurant->load(
    'categories.subcategories.items.modifier_groups_enabled.modifiers_enabled', 
    'categories.subcategories.items.price_levels' 
); 
+0

哎喲,我從來沒有想過這個問題(還沒有看到類似的例子其一)。非常感謝,這種方式更加優雅,甚至比我有的更快。 –

+1

[Lazy Eager Loading](http://laravel.com/docs/5.1/eloquent-relationships#lazy-eager-loading)下的第一個示例顯示兩個關係的加載。你幾乎是這樣做的,你只是加載了兩個嵌套關係的關係,所以你的初始'categories.subcategories.items'對於兩者都是相同的。 –

+0

是的,我只是不認爲我會正確地(或根本)工作與嵌套關係,我甚至沒有嘗試看看它是否會拋出一個錯誤......只是駁斥它是不可能的(並嘗試過許多其他瘋狂的東西)。需要放棄這種方法:) –