laravel查询生成器-groupby,map,sortby/orderby

ztyzrc3y  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(301)

这样做的目的是从订单表中获得最畅销的产品。

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

订单表如下所示

我得到的结果是:

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,
0ejtzxu1

0ejtzxu11#

你需要这样做:

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

bxgwgixi2#

试试这个,

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

在这里,原始查询用于对产品id进行计数,然后进行分组,这样我们就可以获得每个产品id的计数,然后根据需要按计数进行最终排序。
我希望你能理解,如果需要任何关于上述代码的解释,请随时询问。

nzkunb0c

nzkunb0c3#

你可以用 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 :

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

相关问题