Невозможно ограничить таблицу ассоциаций в Laravel и MySql - PullRequest
0 голосов
/ 05 мая 2018

Я использую MYSQL v5.7 и Laravel v5.6, я добавил внешний ключ в таблицу продуктов.

Но получаю ошибку вот так.

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `product` add constraint `product_category_id_foreign` foreign key (`category_id`) references `category` (`id`) on delete cascade)

Это моя таблица продуктов

 public function up()
    {
        Schema::create('product', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('category_id')->unsigned()->nullable();
            $table->integer('admin_id')->unsigned()->nullable();
            $table->string('name');
            $table->string('description');
            $table->integer('price');
            $table->binary('image')->nullable(false)->change();
            $table->timestamps();
        });
        Schema::table('product', function($table){
            $table->foreign('category_id')->references('id')->on('category')->onDelete('cascade');
            $table->foreign('admin_id')->references('id')->on('admin')->onDelete('cascade');
        });
    }

Это моя таблица категорий

public function up()
    {
        Schema::create('category', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->timestamps();
        });
    }

Что здесь не так?

1 Ответ

0 голосов
/ 05 мая 2018

Одной из возможных проблем является разница в типе данных между product.category_id (столбец внешнего ключа) и category.id (ссылочный первичный ключ).

(Это только одна возможность. Возможно, проблема в чем-то другом.)

Но мы должны сначала проверить, что типы данных двух столбцов совпадают точно . Если они не совпадают, мы не сможем определить ограничение внешнего ключа InnoDB.

Я предполагаю, что category.id определяется как BIGINT тип данных.

(Это предположение, я не эксперт по построителю схем Laravel, но я вижу, что построитель схем выполняет большую работу по маскировке / сокрытию фактического определения SQL таблицы MySQL.)

(Не совсем понятно, почему Laravel требует, чтобы тип данных для столбца внешнего ключа был указан. Мы знаем, что он соответствует типу данных указанного столбца.)


Мое предположение при исправлении состоит в том, чтобы изменить эту строку

от:

 $table->integer('category_id')->unsigned()->nullable();

до:

 $table->bigInteger('category_id')->nullable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...