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')
想法是从订单 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
:
->groupBy('product_id', 'price')