#php #mysql #laravel #eloquent #laravel-8
Вопрос:
Я хочу создать таблицу «многие ко многим» между категориями и продуктами. Таблица категорий также имеет отношение один ко многим между своими собственными строками с идентификатором parent_id, ссылающимся на его идентификатор. Перенос таблицы для категории
$table->id();
$table->string('name', 100);
$table->string('image_path', 400)->nullable();
$table->string('url', 100)->unique();
$table->unsignedBigInteger('parent_id')->nullable();
$table->timestamps();
$table->foreign('parent_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('restrict');
Миграция таблиц для продуктов
$table->id();
$table->string('sku')->unique();
$table->integer('popularity')->nullable();
$table->boolean('status')->nullable();
Сводная таблица для связи
$table->unsignedBigInteger('product_id');
$table->string('category_url');
$table->boolean('base_category')->default(false);
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->foreign('category_url')->references('url')->on('categories')->onDelete('cascade');
Модельное соотношение для продуктов
public function categories()
{
return $this->belongsToMany(Category::class, 'product_categories', 'product_id', 'category_url')->withPivot('base_category');
}
Модельное соотношение для категорий
public function children()
{
return $this->hasMany(Category::class, 'parent_id', 'id');
}
public function products()
{
return $this->belongsToMany(Product::class, 'product_categories', 'category_url', 'product_id');
}
Я использую Laravel 8 и пытаюсь извлечь как $product->категории (), так и $categories->>продукты, и они не возвращают данные.
Однако, когда мы устанавливаем $PrimaryKey = ‘url’ в модели категорий, это работает, но $category->children() не работает. Есть ли способ использовать несколько внешних ключей на столе? например, еще один строковый столбец помимо идентификатора?
Комментарии:
1. Почему URL-адрес определяется как PK, если он не является допустимым PK в схеме ?