web-dev-qa-db-fra.com

comment utiliser la clé étrangère dans la migration de laravel 5.1

Je dois utiliser une clé étrangère pour ma base de données mais je ne peux pas le faire. Après avoir exécuté la commande de migration en ligne de commande, le message d'erreur suivant s'affiche:

[Illuminate\Database\QueryException] SQLSTATE [HY000]: Erreur générale: 1215 Impossible d'ajouter une contrainte de clé étrangère (SQL: modifier la table samples ajouter Contrainte sitters_supplier_id_foreign clé étrangère (supplier_id) .__ références suppliers (id)

[PDOException] SQLSTATE [HY000]: Erreur générale: 1215 Impossible d'ajouter contrainte de clé étrangère

Migration des échantillons:

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();
        });

Migration du fournisseur: 

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

J'essaie de le faire avec une nouvelle migration pour les échantillons, mais sans succès:

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

J'essaie de fixer la longueur de la clé primaire à 10, mais j'échoue à nouveau

9
Abolfazl Yavari

L'ordre compte. 

Vous voulez vous assurer que votre table "fournisseurs" existe avant de tenter de référencer une colonne de cette table en tant que contrainte.

Donc, si vous voulez définir votre contrainte de clé étrangère lors de la création de votre table, assurez-vous d’abord de créer la migration " fournisseurs ", puis la migration " échantillons ":

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

... ajouter du code de schéma à vos fichiers de migration. et alors:

php artisan migrate

Si vous ne souhaitez pas vous soucier de l'ordre dans lequel les tables sont créées, effectuez d'abord vos migrations create_table, sans les contraintes de clé étrangère, puis effectuez une migration supplémentaire pour ajouter vos clés étrangères.

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

... ajouter du code de schéma à vos fichiers de migration. Et migrez ensuite avec:

php artisan migrate
7
KorreyD

Enfin, générez une migration pour la table en gardant à l’esprit qu’ils devraient être en ordre si vous sentez une difficulté nommer simplement 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');
        });

placer toutes les clés étrangères liées enfin ici et courir

4
ujwal dhakal

essayez comme ça

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

KorreyD dit vrai! , mais j’ai créé des migrations, puis renommé la migration pour les réorganiser, c’est si simple:

Avant d'être renommé:  

Migration du fournisseur: 2015_08 _ 21 _ 104217_supllier_table.php

Migration des échantillons: 2015_08 _ 22 _ 102325_samples_table.php

Après avoir renommé:

Migration des échantillons: 2015_08 _ 21 _ 102325_samples_table.php

Migration du fournisseur: 2015_08 _ 22 _ 104217_supllier_table.php

mon problème résolu! parce que la migration des fournisseurs a eu lieu avant la migration des échantillons

Commentaire: J'essaie ceci avec un réflecteur, qui a renommé n'importe quel endroit qui utilise le nom de la migration

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

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