【问题标题】:Eloquent/Laravel: Nested lazy eager loading, but return multiple model's relationsEloquent/Laravel:嵌套延迟加载,但返回多个模型的关系
【发布时间】:2015-12-04 15:08:45
【问题描述】:

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

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

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('...') 是否可以写成同时返回所有物品的价格水平和修饰符?

【问题讨论】:

    标签: php laravel eloquent laravel-5.1


    【解决方案1】:

    所以,问题是:$this->restaurant->load('...') 是否可以写成它还返回所有项目的价格水平和修饰符?

    当然,只需像修饰符组一样指定价格水平:

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

    【讨论】:

    • 哎呀,我从来没有想过这个(也没有看到类似的例子)。非常感谢,这种方式更加优雅,甚至比我以前的方式更快。
    • Lazy Eager Loading下的第一个例子展示了两个关系的加载。您几乎在做同样的事情,您只是加载嵌套关系的两个关系,因此您的初始 categories.subcategories.items 对两者都是相同的。
    • 是的,我只是不认为我会在嵌套关系中正常工作(或根本没有),我什至没有尝试看看它是否会引发错误......只是被解雇了这是不可能的(并尝试了许多其他疯狂的东西)。需要努力放弃这种方法:)
    猜你喜欢
    • 2016-05-31
    • 2019-02-26
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2019-05-19
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多