道歉,如果標題沒有多大意義,但這裏是我得到了什麼,我想達到什麼。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('...')
可以這樣寫:它也返回所有物品的價格水平和修飾符?
哎喲,我從來沒有想過這個問題(還沒有看到類似的例子其一)。非常感謝,這種方式更加優雅,甚至比我有的更快。 –
[Lazy Eager Loading](http://laravel.com/docs/5.1/eloquent-relationships#lazy-eager-loading)下的第一個示例顯示兩個關係的加載。你幾乎是這樣做的,你只是加載了兩個嵌套關係的關係,所以你的初始'categories.subcategories.items'對於兩者都是相同的。 –
是的,我只是不認爲我會正確地(或根本)工作與嵌套關係,我甚至沒有嘗試看看它是否會拋出一個錯誤......只是駁斥它是不可能的(並嘗試過許多其他瘋狂的東西)。需要放棄這種方法:) –