【发布时间】: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