Получение значений из связанных таблиц с условием

Есть две таблицы countries (имеет поле name) и cities (имеет поля name и population). Нужно получить все страны вместе с их городами, численность населения которых больше, например, 100.

В файле модели Country прописана связь:

public function cities()
{
  return $this->hasMany(City::class);
}

В файле контроллера CountryController пытаюсь получить все записи с применением условия:

$countries = Country::all()
  ->cities()
  ->where('population', '>', 100);

В результате получаю ошибку:

Method Illuminate\Database\Eloquent\Collection::city does not exist.

p.s. Если получать по id каждую отдельную запись через find($id), то всё работает. Однако, всё, что возвращает несколько записей, будь то all() или find([$id]), то результатом возвращается данная ошибка.


Ответы (1 шт):

Автор решения: Anton Mironov
  1. Если надо получить города с населением больше 100.
$countries = Country::with(['cities' => function($city) {
    $city->where('population', '>', 100);
  }])
  ->get();
  1. Если надо получить страны, в которых есть города с населением больше 100.
$countries = Country::with('cities')
  ->whereHas('cities', function ($city) {
    $city->where('population', '>', 100);
  })
  ->get();
→ Ссылка