Присоединяйте, отключайте и синхронизируйте отношения «многие ко многим» в Laravel


Существует четыре типа отношений, связанных между моделями / объектами. И они: Один к одному, Один ко многим, Много к одному а также Много ко многим, Мы специально поговорим о взаимоотношениях «многие ко многим» и, что наиболее важно, присоединим, отсоединим и синхронизируем вспомогательные методы, которые представлены в Laravel в этой статье.

Что такое отношения «многие ко многим»?

Отношение между двумя объектами называется «многие ко многим», когда несколько записей в таблице связаны с несколькими записями в другой таблице.

Например, скажем, у нас есть две сущности книги а также Авторы, Если вы внимательно наблюдаете за этими отношениями, вы заметите, что у книги может быть несколько авторов, и автор написал несколько книг. В этом случае у вас много книг, связанных со многими авторами.

Итак, если мы хотим определить отношения между этими двумя объектами, нам понадобятся три таблицы базы данных: books, authors и специальный стол, называемый «сводной таблицей» book_author, book_author таблица основана на алфавитном порядке названий связанных моделей и содержит book_id а также author_id колонны.

И вот как мы можем определить отношения в модели Laravel, используя belongsToMany метод:

namespace App;

use IlluminateDatabaseEloquentModel;

class Book extends Model
{
    /**
     * The authors that belong to the book.
     */
    public function authors()
    {
        return $this->belongsToMany('AppAuthor');
    }
}

Мы можем определить модель для Author так же. Теперь, когда отношения определены, вы можете получить доступ к книгам всех авторов следующим образом:

$book = AppBook::find(1);

foreach ($user->authors as $author) {
    dd($author->name);
}

Теперь вернемся к предполагаемой теме этой статьи. Laravel поставляется с удобными маленькими вспомогательными методами, называемыми attach, detach а также sync для того, чтобы добавить определенное количество удобства для отношений многие ко многим. Давайте рассмотрим их один за другим.

attach метод

Этот специальный вспомогательный метод может использоваться для присоединения определенной записи объекта к другой записи объекта в сводной таблице. Например, в приведенном выше примере, если мы хотим прикрепить автора к книге, мы можем использовать attach метод, который вставит связанную запись в сводную / промежуточную таблицу следующим образом:

$book = AppBook::find(1);

$book->authors()->attach($authorId);

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

$book = AppBook::find(1);

$book->authors()->attach($authorId, ('best_seller' => true));

detach метод

Точно так же, если вы хотите удалить определенную связь сущностей из сводной таблицы, вы можете использовать detach метод. Например, если вы хотите удалить определенного автора из книги, вы можете сделать это так.

$book->authors()->detach($authorId);

Или вы можете передать несколько идентификаторов в виде массива.

$book->authors()->detach((4, 5, 8));

Если вы хотите удалить всех авторов из книги, используйте detach без передачи каких-либо аргументов.

$book->authors()->detach();

sync метод

sync вспомогательный метод похож на пересечение attach а также detach метод. Таким образом, в основном то, что этот метод может быть использован для установления связи многих со многими. То есть он будет сохранять только ассоциацию, которая передается ему в виде массива, подобного этому.

$book->authors()->sync((5, 2, 10));

Любые идентификаторы, которых нет в данном массиве, будут удалены из сводной таблицы. Таким образом, только связь, которая останется в сводной таблице, будет (5, 2, 10) в приведенном выше примере для книг и авторов.

Если вы не хотите отсоединять существующие идентификаторы, вы можете использовать syncWithoutDetaching метод:

$book->authors()->syncWithoutDetaching((1, 2, 3));