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

时间:2015-12-04 15:08:45

标签: php laravel eloquent laravel-5.1

道歉,如果标题没有多大意义,但这就是我所拥有的以及我想要实现的目标。

有一个餐厅的菜单,其结构如下:

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('...')可以用这样的方式写出它还能返回所有商品的价格水平和修饰符吗?

1 个答案:

答案 0 :(得分:1)

  

所以,问题是:可以$ this-> restaurant->加载(' ...')以这样的方式写入它也会返回所有项目'价格水平和修饰符?

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

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