Как использовать внешний ключ в миграции laravel 5.1

Мне нужно использовать внешний ключ для моей базы данных, но я не могу этого сделать, после запуска команды миграции в командной строке, я получаю эту ошибку:

[Illuminate\Database\QueryException] SQLSTATE [HY000]: Общая ошибка: 1215 Невозможно добавить ограничение внешнего ключа (SQL: изменить таблицу samples добавить ограничение s amples_supplier_id_foreign внешний ключ (supplier_id) ссылки suppliers (id))

[PDOException] SQLSTATE [HY000]: Общая ошибка: 1215 Не удается добавить ограничение внешнего ключа

Перенос проб:

Schema::create('samples', function (Blueprint $table) {
            $table->Increments('id',true);
            $table->string('variety',50);
            $table->integer('supplier_id')->unsigned();
            $table->foreign('supplier_id')->references('id')->on('suppliers');
            $table->string('lot_number');
            $table->date('date');
            $table->integer('amount');
            $table->integer('unit_id')->unsigned();
            $table->foreign('unit_id')->references('id')->on('unit');
            $table->string('technical_fact');
            $table->string('comments');
            $table->string('file_address');
            $table->integer('category_id')->unsigned();
            $table->foreign('category_id')->references('id')->on('category');
            $table->timestamps();
        });

Перенос поставщика:

Schema::create('suppliers', function (Blueprint $table) {
            $table->Increments('id',true);
            $table->string('supplier',50);
            $table->timestamps();
        });

Я пытаюсь сделать это с новой миграцией для образцов, но не увенчался успехом:

Schema::create('samples', function (Blueprint $table) {
                $table->Increments('id',true);
                $table->string('variety',50);
                $table->integer('supplier_id')->unsigned();
                $table->string('lot_number');
                $table->date('date');
                $table->integer('amount');
                $table->integer('unit_id')->unsigned();
                $table->string('technical_fact');
                $table->string('comments');
                $table->string('file_address');
                $table->integer('category_id')->unsigned();
                $table->timestamps();
        });

        Schema::table('samples', function($table) {
            $table->foreign('supplier_id')->references('id')->on('suppliers');
            $table->foreign('unit_id')->references('id')->on('unit');
            $table->foreign('category_id')->references('id')->on('category');
        });

Я пытаюсь исправить длину первичного ключа до 10, но неудачно снова

Ответ 1

Заказ имеет значение.

Вы хотите убедиться, что ваша таблица "поставщиков" существует, прежде чем пытаться ссылаться на столбец этой таблицы в качестве ограничения.

Поэтому, если вы хотите установить ограничение внешнего ключа при создании таблицы, убедитесь, что сначала вы создали миграцию " поставщиков ", а затем миграцию " образцов ":

php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration create_samples_table --create=samples

... добавить код схемы в ваши файлы миграции. а потом:

php artisan migrate

Если вы не хотите беспокоиться о порядке создания таблиц, сначала выполните миграцию create_table без ограничений внешнего ключа, а затем выполните дополнительную миграцию, чтобы добавить внешние ключи.

php artisan make:migration create_samples_table --create=samples
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration alter_samples_table --table=samples   <-- add your foreign key constraints to this migration file

... добавить код схемы в ваши файлы миграции. А затем перенести с помощью:

php artisan migrate

Ответ 2

Наконец, сгенерируйте миграцию для таблицы, помните, что они должны быть в порядке, если вы чувствуете, что какие-либо разногласия просто называют ur table_foreign_keys

 Schema::table('samples', function($table) {
            $table->foreign('supplier_id')->references('id')->on('suppliers');
            $table->foreign('unit_id')->references('id')->on('unit');
            $table->foreign('category_id')->references('id')->on('category');
        });

поместите сюда все внешние ключи и запустите

Ответ 3

попробуйте этот путь

Schema::table('samples', function($table) {
        $table->integer('supplier_id')->unsigned();
        $table->foreign('supplier_id')->references('id')->on('suppliers');
        $table->integer('unit_id')->unsigned();
        $table->foreign('unit_id')->references('id')->on('unit');
        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('category');
    });

Ответ 4

Коррей D сказать правду!, но я создал миграции, а затем переименовал миграцию, чтобы переупорядочить их. Это так просто:

Перед переименованием:

Перенос поставщика: 2015_08_ 21 _104217_supllier_table.php

Перенос проб: 2015_08_ 22 _102325_samples_table.php

После переименования:

Перенос проб: 2015_08_ 21 _102325_samples_table.php

Перенос поставщика: 2015_08_ 22 _104217_supllier_table.php

моя проблема решена! потому что миграция поставщика выполняется до миграции образцов

Комментарий: я пытаюсь сделать это с помощью отражателя, который переименовал все, где использовалось имя миграции

Ответ 5

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

Ответ 6

Все правы, но самый простой способ - создать обычные файлы миграции. Например, у вас будет 2019_01_21_123456_create_table_one_table.php...

Я переименовал их всех

2019_01_21_0010_create_table_one_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php

Теперь, если мне нужно добавить миграцию до table_two и после table_one, я могу просто изменить ее на

2019_01_21_0015_create_table_five_table.php

Теперь порядок миграции будет

2019_01_21_0010_create_table_one_table.php
2019_01_21_0015_create_table_five_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php