2017-03-08 48 views
1
JSON編碼的嵌套關係

我從數據庫中使用Laravel的(5.2)雄辯ORM像這樣獲取數據:性能問題,當在Laravel

$orders = Order::with([ 
    'customer', 
    'items', 
    'items.product', 
    'items.product.shop' => function ($query) { 
     $query->select(['id', 'title']); 
    } 
])->get(); 

注:爲什麼訂單不依賴於一個理由單店是訂單可能包含來自多個商店的物品。每個項目都會引用訂購的產品,而這些產品又參考了其所屬的商店。

這工作得很好,但是,當我想要返回結果到視圖並呈現它時,它需要很長時間json_encode它。

我確認json_encode確實是瓶頸,如果我只是執行查詢並立即死亡,響應幾乎是即時的。但是,如果我在查詢後執行了$orders->toJson()(或json_encode($orders)),則我將遇到與將結果返回給視圖相同的延遲響應。

顯然問題在於items.product.shop的(太深?)嵌套屬性,如果我刪除它,則調用json_encode不會導致任何性能問題。

這裏的一個單級的輸出樣本:

{ 
    "id": 71, 
    "total_sum": "5.88", 
    "customer": { 
    "id": 68, 
    "first_name": "One Large", 
    "last_name": "Men's" 
    }, 
    "items": [ 
    { 
     "id": 105, 
     "quantity": "1", 
     "price_single": "1.2", 
     "price_total": "1.2", 
     "color_id": "6", 
     "size_id": "5", 
     "order_id": "71", 
     "product": { 
     "id": 149, 
     "name": "Men's", 
     "shop": { 
      "id": 109, 
      "title": "general test" 
     } 
     } 
    } 
    ] 
} 
+0

如果您從「商店」加載中刪除自定義選擇,它是否會使事情更快? – apokryfos

+0

不,它存在的原因實際上是因爲我認爲'shop'中的某些屬性(如'description')可能會導致性能問題,因爲它們包含大量文本。但是,只選擇兩個屬性並沒有幫助。 – falloutghst

+0

我也可以做'dump($ orders);'很好,性能問題只會在我引入json_encode($ orders)時出現' – falloutghst

回答

0

實測值的罪魁禍首,我有一個附加的屬性在我shop模型(通過$appends加入),其被用嵌套的for循環計算。

直接在商店工作時,顯然還是夠快的,但由於在上面的例子中每個訂單有幾個項目,每個項目都參考一個商店,所以性能下降。