【问题标题】:Laravel Eloquent - sorting parent based on child relationship attributeLaravel Eloquent - 基于子关系属性排序父级
【发布时间】:2020-01-29 13:54:26
【问题描述】:

我有一个Product,它有多个Variants

我想选择所有产品并根据第一个底层变体子代的价格对其进行排序。

产品 A

  • 变体 A1(价格:3 美元)
  • 变体 A2(价格:3 美元)

产品 B

  • 变体 B1(价格:2 美元)
  • 变体 B2(价格:2 美元)

产品 C

  • 变体 C1(价格:4 美元)
  • 变体 C2(价格:4 美元)

在这种情况下,如果我想以asc 的价格订购,我希望得到以下结果订购:

  • 产品 B
  • 产品A
  • 产品C

我当前(不工作)的查询:

Product::with(['variants' => function ($q) {
   $q->orderBy('price', 'desc');
}])->orderBy('variants.price', 'desc')->get();

【问题讨论】:

  • 特定产品的变体价格是否始终相同?
  • 我意识到这是一个有点奇怪的场景,但是是的,它们可能会有所不同,但是在这种情况下它是无关紧要的——这就是为什么能够过滤第一个找到的东西会很棒。
  • 最高价格而不是第一次找到怎么样?

标签: php laravel eloquent


【解决方案1】:

1st:不能使用with下单:

因为 with 会像这样进行单独的查询:

SELECT * FROM users;
SELECT * FROM roles WHERE id IN (1, 2, 3, 4, whatever...);

2nd:你的问题的解决方案是使用join 语句只进行1次查询:

例如:

$order = 'desc';
$products = Product::join('variants', 'variants.product_id', '=', 'products.id')->orderBy('products. price', $order)->select('products.*')->paginate(10);

希望对你有用,谢谢

【讨论】:

    【解决方案2】:

    您可以在获取后订购它们。

    $products = Product::with('variants')
        ->get()
        ->sortBy(function($product) {
            // if you want to order by first found
            return $product->variants->first()->price;
    
            // if you want to order by max price
            return $product->variants->max->price;
    
            // or min price
            return $product->variants->min->price;
    
            // or average price
            return $product->variants->average->price;
        });
    

    【讨论】:

    • 我有分页所以不太理想,在get()之前没有办法订购吗?
    【解决方案3】:

    使用以下查询解决了它:

    Product::join('variants', function ($join) {
       $join->on('variants.product_id', '=', 'products.id');
    })
       ->select('products.*', DB::raw("MAX(variants.price) as max_variant_price"))
       ->groupBy('variants.product_id')
       ->orderBy('max_variant_price')
       ->get();
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 2017-12-11
      • 2023-03-28
      • 2015-07-05
      • 1970-01-01
      • 2017-04-02
      • 2014-07-21
      • 2021-01-25
      相关资源
      最近更新 更多