Примеры таблиц: категории - продукты, при этом, категория может содержать множество продуктов, и продукт может принадлежать разным категориям.
Для реализации такой связи необходимо:
1. Создать связующую таблицу, содержащую два внешних ключа. Имена полей должны соответствовать следущему формату:
<имя связываемой модели>_id
Пример связующей миграции category_product
:
Schema::create('category_product', function (Blueprint $table) { $table->unsignedInteger("category_id")->comment("Связь с категорией"); $table->unsignedInteger("product_id")->comment("Связь с продуктом"); $table->foreign("category_id") ->references("id")->on("reviews") ->onDelete("cascade"); $table->foreign("category_id") ->references("id")->on("courses") ->onDelete("cascade"); });
2. В первой связываемой модели объявить метод, имя которого совпадает с именем связываемой таблицы и возвращает объект связи с помощью метода belongsToMany
.
public function products(){ return $this->belongsToMany(Category::class); }
3. Теперь в классах для добавления связи можно использовать метод attach()
, который связывает текущую запись со связанными ключами.
public function postReviewCourse(Request $request, Review $review){ $review->courses()->attach($request->course_id); }
Либо метод sync
, который связывает текущую запись с указанными в массиве ключами, все остальные ключи, не указанные в массиве - отвязываются.
$review->courses()->sync([$request->course_id]);
Либо syncWithoutDetaching
, который делает тоже что sync, однако без отвязывания записей.
$review->courses()->syncWithoutDetaching($request->course_id);