我正在使用Laravel(5.2)Eloquent ORM从数据库中获取数据,如下所示:
$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 :(得分:0)
找到了罪魁祸首,我的shop
模型中有一个额外的属性(通过$appends
添加),该属性通过使用嵌套的for循环进行计算。
直接在商店工作时显然仍然足够快,但由于在上面的示例中,每个订单都有多个商品,每个商品都引用商店,性能会下降。