Laravel Query Builder - groupBy, карта, sortBy / orderBy - PullRequest
0 голосов
/ 25 ноября 2018

Идея состоит в том, чтобы получить самые продаваемые товары из таблицы заказов.

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

Таблица заказов выглядит следующим образом

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 голосов
/ 26 ноября 2018

Попробуйте это,

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

Здесь необработанный запрос используется для подсчета идентификаторов продукта, а затем сгруппированы так, чтобы мы могли получить счетчик для каждого идентификатора продукта, а затем, наконец, упорядочить по количеству согласно требованию.

Я надеюсь, что вы поймете, и если вам понадобится какое-либо объяснение относительно приведенного выше кода, не стесняйтесь спрашивать.

0 голосов
/ 26 ноября 2018

Вы можете использовать метод 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();

Примечание: Возможно, вам потребуется указать столбцы в предложении select в вашем ->groupBy:

->groupBy('product_id', 'price')
0 голосов
/ 26 ноября 2018

Вам нужно сделать что-то вроде этого:

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