Laravel查询生成器-groupBy,map,sortBy / orderBy

时间:2018-11-25 14:30:26

标签: php mysql laravel query-builder

想法是从订单表中获得最畅销的产品。

Order::select('product_id', 'price')->get()->groupBy('product_id')
    ->map(function ($row) {
       return $row->count('product_id');
});

Order表如下所示

enter image description here

我得到类似的东西

product_id: count

"8" : 2,
"34": 1,
"36": 1,
"28": 1,
"31": 1,
"40": 1,
"44": 1,
"46": 1,
"47": 2

但是我仍然需要按计数排序。我该怎么办?

预期

"8" : 2,
"47": 2,
"34": 1,
"36": 1,
"28": 1,
"31": 1,
"40": 1,
"44": 1,
"46": 1,

3 个答案:

答案 0 :(得分:1)

您需要执行以下操作:

Order::select('product_id', 'price',\DB::raw("COUNT('product_id') as product_count"))->groupBy('product_id')->havingRaw("COUNT('product_id') > ?", [0])->orderBy('product_id','ASC')->get();

答案 1 :(得分:1)

尝试一下,

Order::select('product_id', 'price',\DB::raw('COUNT(product_id) as count'))->groupBy('product_id')->orderBy('count')->get();

在这里,原始查询用于对产品ID进行计数,然后进行分组,以便我们可以对每个产品ID进行计数,最后根据需求按计数进行排序。

希望您能理解,如果需要有关上述代码的任何解释,请随时提问。

答案 2 :(得分:1)

您可以在集合上使用sortBy方法:

Order::select('product_id', 'price')->get()->groupBy('product_id')
->map(function ($row) {
   return $row->count('product_id');
})->sortBy('count');

如果您希望以降序排列:

Order::select('product_id', 'price')->get()->groupBy('product_id')
->map(function ($row) {
   return $row->count('product_id');
})->sortByDesc('count');

如果您希望使用sql进行排序:

Order::select('product_id', 'price',\DB::raw('COUNT(product_id) as count'))
->groupBy('product_id', 'price')
->orderBy('count')->get();

注意:您可能需要在->groupBy的select子句中指定列:

->groupBy('product_id', 'price')