it-swarm.com.ru

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

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

[Осветить\База данных\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, но снова неудачно

9
Abolfazl Yavari

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

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

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

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
7
KorreyD

Наконец, создайте миграцию для таблицы, имейте в виду, что они должны быть в порядке, если вы чувствуете какие-либо трудности, просто назовите 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');
        });

наконец, поместите все внешние ключи, связанные здесь

4
ujwal dhakal

попробуй так

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');
    });
1
Imtiaz Pabel

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

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

Миграция поставщиков: 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

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

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

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

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