想法是从订单表中获得最畅销的产品。
Order::select('product_id', 'price')->get()->groupBy('product_id')
->map(function ($row) {
return $row->count('product_id');
});
Order表如下所示
我得到类似的东西
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,
答案 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')