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

Laravel Query Builder - groupBy, map, sortBy / orderBy

想法是从订单 table 中获取最畅销的产品。

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

订单 table 看起来像这样

我得到类似的东西:

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,

你需要做这样的事情:

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();

试试这个,

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

这里使用raw query统计产品id,然后分组,这样我们就可以得到每个产品id的计数,最后按需求排序。

希望您能理解,如果需要对上述代码进行任何解释,请随时询问。

您可以在 collection 上使用 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')