Связь многие ко многим в Laravel

Пусть каждый пост может принадлежать нескольким категориям. В этом случае они будут связаны через промежуточную таблицу связи.

Давайте посмотрим на структуру таблиц. Таблица с постами:

posts

  • id
  • title

Таблица с категориями:

categories

  • id
  • name

Таблица связи:

category_post

  • id
  • post_id
  • category_id

Первая связь

Каждый пост принадлежит многим категориям. Давайте пропишем эту связь через отношение belongsToMany:

app/Models/Post.php<?php
  class Post extends Model
  {
    public function categories()
    {
      return $this->belongsToMany(Category::class);
    }
  }
?>

Получим пост вместе с его категориями:

app/Http/Controllers/PostController.php<?php
  class PostController extends Controller
  {
    public function show()
    {
      $post = Post::find(1);
      dump($post->categories);
    }
  }
?>

Вторая связь

Каждая категория принадлежит многим постам. Давайте пропишем эту связь через отношение belongsToMany:

app/Models/Category.php<?php
  class Category extends Model
  {
    public function posts()
    {
      return $this->belongsToMany(Post::class);
    }
  }
?>

Получим категорию вместе с ее постами:

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

Практические задачи

Пусть у нас есть юзеры и их роли. Каждый юзер может иметь много ролей. Даны соответствующие таблицы:

users

  • id
  • name

roles

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

Создайте для указанных таблиц таблицу связи.

Задание 2

Свяжите юзеров с ролями отношением belongsToMany. Получите всех юзеров вместе с их ролями.

Задание 3

Свяжите роли с юзерами отношением belongsToMany. Получите всех роли вместе с их юзерами.