Как подсчитать количество объектов в elequont Object внутри группы by в уже запрошенной коллекции?

#php #laravel #model #laravel-5.2

#php #laravel #Модель #laravel-5

Вопрос:

Это мой текущий результат

 Collection {#794 ▼
  #items: array:8 [▼
    "IN" => Collection {#795 ▶}
    "NZ" => Collection {#787 ▶}
  ]}
  

Я хочу, чтобы элементы содержали количество no для каждого кода, например

 "IN" => 4,
"NZ" => 3,
  

Я знаю, что могу напрямую написать в запросе, подобном этому

 $query->groupBy('country_code')->orderBy('country_code', 'ASC');
    return $query->get([
        DB::raw('country_code as country_code'),
        DB::raw('COUNT(*) as "count"')
    ]);
  

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

Прямо сейчас я могу группировать только по коллекции следующим образом

 $collection->groupBy('country_code');
  

Ответ №1:

 $b = $a->groupBy('country_code');
  

Вы выполнили большую часть работы, правильно сгруппировав данные на основе country_code. Теперь осталось просто выполнить итерацию по коллекции с помощью foreach, ключа, значения и использовать метод count () collections для подсчета количества элементов, хранящихся под данным country_code

 foreach ($b as $countryCode => $items) {
    echo $items->count()."n";
}
  

Воспроизвести:

 php artisan ti
Psy Shell v0.7.2 (PHP 7.0.8-0ubuntu0.16.04.3 — cli) by Justin Hileman
>>> $cities = collect([['country_code' => 'pl', 'name' => 'Warszawa'], ['country_code' => 'pl', 'name' => 'Wrocław'], ['country_code' => 'de', 'name' => 'Berlin']]);
=> IlluminateSupportCollection {#846
     all: [
       [
         "country_code" => "pl",
         "name" => "Warszawa",
       ],
       [
         "country_code" => "pl",
         "name" => "Wrocław",
       ],
       [
         "country_code" => "de",
         "name" => "Berlin",
       ],
     ],
   }
>>> $grouped = $cities->groupBy('country_code');
=> IlluminateSupportCollection {#836
     all: [
       "pl" => IlluminateSupportCollection {#838
         all: [
           [
             "country_code" => "pl",
             "name" => "Warszawa",
           ],
           [
             "country_code" => "pl",
             "name" => "Wrocław",
           ],
         ],
       },
       "de" => IlluminateSupportCollection {#837
         all: [
           [
             "country_code" => "de",
             "name" => "Berlin",
           ],
         ],
       },
     ],
   }
>>> foreach ($grouped as $cCode => $cities) {
... echo $cCode . ' has '.$cities->count()."n";
... }
pl has 2
de has 1
  

Комментарии:

1. Пожалуйста, отредактируйте свой ответ, чтобы включить больше информации. Ответы «только код» и «попробуйте это» не приветствуются, поскольку они не содержат содержимого с возможностью поиска и не объясняют, почему кто-то должен «попробовать это».

2. Хорошо, я сделаю. Спасибо.