Условия в связи один ко многим в Laravel

Можно добавлять дополнительные условия при получении связанных данных. Давайте посмотрим, как это делается. Пусть у нашей таблицы с постами будет также и поле likes, содержащее количество лайков:

posts

  • id
  • title
  • likes
  • category_id

Давайте для начала получим категорию вместе с коллекцией ее постов:

app/Http/Controllers/CategoryController.php<?php
  class CategoryController extends Controller
  {
    public function show()
    {
      $posts = Category::find(1)->posts;
      dump($posts);
    }
  }
?>

Теперь заменим свойство posts на метод posts(). В этом случае метод своим результатом вернет построитель запросов:

app/Http/Controllers/CategoryController.php<?php
  class CategoryController extends Controller
  {
    public function show()
    {
      $qb = Category::find(1)->posts();
      dump($qb);
    }
  }
?>

Так как возвращается построитель запросов, то мы можем дальше продолжить цепочку, к примеру, наложив некоторое условие на получаемые посты:

app/Http/Controllers/CategoryController.php<?php
  class CategoryController extends Controller
  {
    public function show()
    {
      $posts = Category::find(1)
        ->posts()
        ->where('likes', '>', 10)
        ->get();
      
      dump($posts);
    }
  }
?>
Задание 1

Сделайте следующие таблицы:

cities

  • id
  • name
  • population
  • country_id

countries

  • id
  • name
Задание 2

Свяжите таблицу countries с таблицей cities отношением hasMany.

Задание 3

Получите все страны вместе с их городами, население в которых больше 100 тысяч.

Задание 4

Получите все страны вместе с их городами. Города каждой страны отсортируйте по возрастанию населения.