#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. Хорошо, я сделаю. Спасибо.