使用聚合函数进行预先加载

时间:2017-02-07 00:39:48

标签: sql laravel eloquent laravel-5.3 eager-loading

我正在尝试使用Laravel的Eager加载来解决我商店中的N + 1查询问题。

-A产品有多种变体,每种变体都有价格

- 商店页面列出了所有产品及其价格。活跃会员看到折扣价格,因此价格()和regularPrice()。

- 我相信scopeRegularPrice()中的min()和max()没有被正确加载。

使用聚合函数进行预先加载是否有最佳做法?

产品型号 enter image description here

控制器 enter image description here

刀片输出 enter image description here 查询结果(通过Blackfire调试工具)

enter image description here

2 个答案:

答案 0 :(得分:0)

你当地的范围应该回归一些东西。所以添加

public function scopeRegularPrice() {
    ...
    return 'something'
}

如果你已经回复了什么,那么抱歉。我在代码中看不到任何return语句。

答案 1 :(得分:0)

范围应该以任何方式返回Querybuilder;

您可能最好将其作为产品型号属性的常规价格;

按价格排序变化关系。 并将此方法添加到产品类。

 public function getRegularPriceAttribute() {

       $variations = $this->variations;
       // Get the live variations by where on collection , not DB query.
       $liveVaries = $variations->where('live', true)->all();
      // the first is the cheapest because you the variations relation should be orderBy('price')
       if (! empty($liveVaries)) return [first($liveVaries)->price, last($liveVaries)->price];

       return [first($variations)->price, last($variations)->price];}