👺
Cheatsheet
  • 👋My cheatsheet
  • 🐘PHP
    • Тернарные операторы
    • Замыкания в PHP
    • Таблица сравнения типов PHP
  • 🟨JS
    • JS cheat sheet
    • Тернарные операторы || ?? &&
    • Таблица сравнения типов JS
    • Область видимости в JS
    • Перебор объектов через for(key in obj)
    • Доступ к свойству через переменную []
    • this в JS
    • Конструктор, оператор "new"
    • bind привязка контекста (this)
    • Замыкания в JS ...
  • ❤️Laravel
    • Laravel websockets
    • Загрузка файлов и пути к ним
    • Vite сборка изображений
    • Vite сборка CSS и JS
    • Vite подключение jQuery
    • Vite подключение Bootstrap
    • Laravel AJAX (with jQuery)
    • Дерево категорий Laravel
    • Laravel + CK-Editor + El FInder
    • Laravel deploy
    • Laravel фасады и сервис провайдеры
    • Отношения
      • Один-к-Одному
      • Один-ко-Многим
      • Многие-ко-Многим
      • Полиморфные отношения
    • Laravel cheatsheet (MAIN)
    • Laravel cheatsheet (BIG)
      • Artisan
      • Auth
      • Blade
      • Cache
      • Composer
      • Config
      • Container
      • Cookie
      • DB
      • Environment
      • Event
      • Eloquent Model
      • File
      • Form
      • HTML
      • Helper
      • Input
      • Lang
      • Log
      • Mail
      • Pagination
      • Queue
      • Redirect
      • Request
      • Response
      • Route
      • SSH
      • Schema
      • Security
      • Session
      • String
      • URL
      • UnitTes
      • Validation
      • View
    • Laravel cheatsheet (BIG PLAIN)
  • 📕PDO
    • SELECT
    • WHERE
    • INSERT
    • UPDATE
    • DELETE
    • JOIN
    • GROUP BY
    • Дерево
    • Дерево ООП
    • Дерево в массив
  • 🐋Docker
    • Docker hub push
    • Docker offline
  • 🥤Gulp
  • 🌊jQuery
  • 🪄Composer
  • 4️⃣Composer PSR-4
  • 🍥RegEx
  • 🐙Git
  • 🧑‍💻Node js
  • 🛍️PHPStorm
  • 💻Zsh
  • 🤖Arduino
Powered by GitBook
On this page
  1. Laravel
  2. Отношения

Многие-ко-Многим

Last updated 1 year ago

Миграции для моделей
create-categories-table
public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }
create-products-table
public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->float('price');
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }
create-category_product-table
public function up()
    {
        Schema::create('category_product', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('category_id');
            $table->unsignedBigInteger('product_id');
            $table->foreign('category_id')->references('id')->on('categories');
            $table->foreign('product_id')->references('id')->on('products');
        });
    }

Пример отношения Многие-ко-Многим Category и Product

  • Product может принадлежать многим Category

  • Category может принадлежать многим Product

app/Models/Product.php
class Product extends Model
{
    public function categories()
    {
        return $this->belongsToMany(Category::class);
        // return $this->belongsToMany(Category::class, 'category_product', 'product_id', 'category_id');
    }
}
app/Models/Category.php
class Category extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class);
        // return $this->belongsToMany(Product::class, 'category_product', 'category_id', 'product_id');
    }
}

Получение данных «Многие-ко-Многим»

// получаем все продукты которые связаны с этой категорией
$category = Category::find(1);
$category->products;
// получаем категории которые связаны с этим продуктом
$product = Product::find(1);
$product->categories;

Создание отношения «Многие-ко-Многим»

// создаём категории
$category = new Category(['name' => 'phones']);
$category->save();
$category2 = new Category(['name' => 'smartphones']);
$category2->save();

// создаём продукт
$product = new Product([
    'name'  =>  'Home Brixton Faux Leather Armchair',
    'price' =>  199.99,
]);
// сохраняем его в БД
$product->save();
// выбираем категрии с айди 1 и 2
$categories = Category::find([1,2]);
// присоединяем продукт к категориям
$product->categories()->attach($categories);
$product->categories()->attach($product);
$category->products()->attach($category);

Оба метода делают одно и то же
$product->categories()->syc($product);
делает то же самое но без дубликатов

Удаление отношения «Многие-ко-Многим»

$category = Category::find(2);
$product = Product::find(1);
// удаляем отношение категории 2 с продуктом 1
$product->categories()->detach($category);

Подробнее -

❤️
https://laravel.demiart.ru/many-to-many-relationship/