Laravel несколько внешних ключей на столе

#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 в схеме ?