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

Давайте представим себе гипотетическую ситуацию, в которой у нас есть некая электронная библиотека и нам нужна возможность не только получать список жанров определённой книги, но и список всех книг по определённому жанру. Вот здесь и пригодится связь "многие-ко-многим"? Как это лучше организовать в техническом плане? Для этого потребуются три таблички. 

В первой будут храниться книги и называться она допустим будет company_library_books. В этой табличке будут два поля - id и title (название книги). 

Вторая таблица будет называться company_library_genres, и в ней будет храниться список жанров. Здесь так же будут два поля - id и genre_title.

И в последней таблице, будет храниться связь между книгами и жанрами. Называться она будет company_library_books_genres и у неё так же будут две колонки: 

book_id - которая соответствует id в таблице книги. 
genre_id - которая соответствует id в таблице жанра. 

Я исхожу из того, что у нас уже сформированы модели Book и Genre. 

Предположим мы хотим получить все жанры для одной книги. Тогда в модели Book у нас должно быть задано свойство: 

public $belongsToMany = [
    'genres' => [
    'Company\Library\Models\Genre',
    'table' => 'company_library_books_genres'
  ]
];

Благодаря этому, теперь во view, в переменной объекта книги мы можем получить все принадлежащие ей жанры так: 

{% for genre in book.genres %}
  {{ genre.genre_title }}<br>
{% endfor %}

И рассмотрим обратную ситуацию, когда нужно получить все книги, принадлежащие определённому жанру. Следовательно, в модели Genre должно быть прописано такое свойство: 

public $belongsToMany = [
    'books' => [
    'Company\Library\Models\Book',
    'table' => 'company_library_books_genres'
  ]
];

Во view, в переменной объекта жанра, список всех книг можно получить так: 

{% for book in genre.books %}
  {{ book.name }}<br>
{% endfor %}

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.