Получить количество уникальных значений с именем столбца в коллекции Laravel 5.2

Я пытаюсь получить количество уникальных брендов из моей таблицы продуктов с их подсчетом из коллекции Laravel.

Я смог сделать это, используя конкретный запрос для продуктов, но причина, по которой я сейчас использую коллекцию, заключается в том, что я также хочу получить происхождение продукта (страна), условия (использованные/новые) продуктов, и я подумал, что это было бы намного лучше использовать коллекцию из одного запроса, а не три отдельных запроса для каждого из данных.

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

Вот таблица введите здесь описание изображения

Вот мой контроллер

$products = DB::table('products')
 ->select('products.*')
 ->whereNull('products.deleted_at')
 ->get();

$BrandCollection = collect($products);
$Brands = $BrandCollection->unique('Brand')->sortBy('Brand')->keyBy('Brand')->pluck('Brand');

Итак, я ищу результат

HP 3
Toshiba 2
Lenovo 1

Я думал, что это можно сделать с помощью concat для коллекции, но, поскольку я работаю на Laravel 5.2, я ищу другие решения.


person user3659497    schedule 11.10.2017    source источник


Ответы (2)


Если вы действительно хотите использовать коллекции (не Eloquent), вы можете сделать это следующим образом:

$brandsWithCount = $BrandCollection->groupBy('Brand')->map(function($values) {
    return $values->count();
})->sort()->reverse();

Например, если вы установите $brandCollection следующим образом:

$BrandCollection = collect([
    ['Brand' => 'HP'],
    ['Brand' => 'HP'],
    ['Brand' => 'HP'],
    ['Brand' => 'Toshiba'],
    ['Brand' => 'Toshiba'],
    ['Brand' => 'Lenovo'],
]);

результат будет:

Collection {#372
  #items: array:3 [
    "HP" => 3
    "Toshiba" => 2
    "Lenovo" => 1
  ]
}

как и ожидалось.

person Marcin Nabiałek    schedule 11.10.2017
comment
Идеальный! Работал как шарм. - person user3659497; 11.10.2017
comment
Как бы вы применили сортировку? Coz- sort('Бренд)->reverse() не работает - person user3659497; 11.10.2017
comment
@user3659497 user3659497 У меня работает, вы проверили? sort должен сортировать по возрастанию, а reverse будет в обратном порядке - person Marcin Nabiałek; 11.10.2017
comment
Не знаю почему, но это не сработало, я добавил сортировку перед groupBy и удалил последнюю -›sort()-›reverse(), и теперь она работает. $Brands = $BrandCollection-›sortBy('Бренд')-›groupBy('Бренд')-›map(function($values) { return $values-›count(); }); Спасибо - person user3659497; 11.10.2017
comment
Таким образом, приведенный выше код работает отлично, и я могу dd() собрать коллекцию в своем представлении, но я не могу понять, как отобразить конечный результат в таблице, поскольку цикл @foreach просто представляет числовые значения. Мне нужно отобразить пары имя-значение. Как вы отображали свои результаты из созданной выше коллекции? - person Hondaman900; 02.09.2020
comment
Вы только что сэкономили мне часы работы :) Приветствую вас - person Vincent Valentine; 29.07.2021

Существует помощник по сбору под названием CountBy, который делает именно то, что вам нужно.

Подсчет коллекций

$BrandCollection->countBy('Brand');

Он вернется, как и ожидалось

#items: array:3 [
    "HP" => 3
    "Toshiba" => 2
    "Lenovo" => 1
  ]

Просто: Д

person Julio Popócatl    schedule 21.11.2020