当json在Laravel中编码嵌套关系时的性能问题

时间:2017-03-08 13:00:38

标签: php json laravel

我正在使用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"
        }
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

找到了罪魁祸首,我的shop模型中有一个额外的属性(通过$appends添加),该属性通过使用嵌套的for循环进行计算。

直接在商店工作时显然仍然足够快,但由于在上面的示例中,每个订单都有多个商品,每个商品都引用商店,性能会下降。