Как использовать PHP Laravel Eloquent groupBy и метод sum с двумя родственными моделями? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть три модели Country, Province и District.Country имеет отношение «один ко многим» как с моделями Province, так и с DistrictProvince имеет отношение один-ко-многим с District моделью.Модель District имеет province_id в качестве внешнего ключа.

В модели District у меня есть сумма для суммирования.Я хочу получить сумму населения для каждой провинции.

$population = Country::where(['name' => $c_name])->first()->districts;
$num = $population->groupBy('province_id')->map(function ($row) {
    return $row->sum('population_m');
});

SQL-запрос:

SELECT provinces.name, SUM(districts.population_m) AS population_m, SUM(districts.population_f) AS population_f FROM provinces
LEFT JOIN districts ON provinces.id = districts.province_id
GROUP BY provinces.name;

Приведенное выше возвращает идентификатор провинции, но я хочу указать название провинции вместе с ним.

Ответы [ 2 ]

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

Вы говорите это группировать по провинция_ид: $population->groupBy('province_id').Вместо этого вы можете передать функцию в метод groupBy() collection, чтобы сообщить ей, как группировать элементы внутри:

https://laravel.com/docs/5.7/collections#method-groupby

Попробуйте что-то вроде этого:

$population = Country::where(['name' => $c_name])->first()->districts;
$num = $population->groupBy(function($district, $key) {
    return $district->province->name;
})->map(function ($row) {
    return $row->sum('population_m');
});
0 голосов
/ 26 октября 2018

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

$population = Country::where(['name' => $c_name])->first()->districts()->with('province')->get(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...