Eloquent/Laravel:嵌套懒惰渴望加载,但返回多个模型';的关系


Eloquent/Laravel: Nested lazy eager loading, but return multiple model's relations

如果标题没有多大意义,我们深表歉意,但以下是我的收获和我想要实现的目标。

有一家餐厅的菜单,它的结构是这样的:

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('...')是否可以这样写,即它也返回所有商品的价格水平和修饰符?

所以,问题是:$this->restaurant->load("…")是否可以这样写,即它也返回所有商品的价格水平和修饰符?

当然,只需以与修改器组相同的方式指定价格水平:

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