Clés étrangère laravel

Par alexisgeneau, il y a 10 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.
Je veux utiliser un champ "key" dans ma base de données comme clé étrangère mais lorsque je lance la commande

php artisan migrate

je reçois un message d'erreur

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint users_role_key_foreign foreign key (`role_key`) references `role` (`key`) on delete restrict on update restrict)

voila une partie de mon code :

ma table users

Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->integer('key')->unique(); $table->string('email')->unique(); $table->timestamps(); });

ma table role

Schema::create('role', function (Blueprint $table) { $table->increments('id'); $table->integer('key')->unique(); $table->string('title')->unique(); $table->timestamps(); });

et mon fichier add_foreign_key

Schema::table('users', function(Blueprint $table) { $table->foreign('role_key')->references('key')->on('role') ->onDelete('restrict') ->onUpdate('restrict'); });

je ne comprend pas d'où vient mon problème, ma BDD est bien en InnoDB.
merci d'avance pour votre aide

10 réponses

Alexandre #lbac, il y a 10 ans

Tu dois utiliser la méthode unsigned() sur ta clé étrangère :

$table->integer('key')->unsigned()->index();

Et elle ne doit pas forcément être unique. En règle générale pas du tout même.

alexisgeneau, il y a 10 ans

je viens de m'apercevoir que je n'avait pas mis le bon morceau de code.
j'ai bien unsigned() mais pas index().. c'est important ?

alexisgeneau, il y a 10 ans

table users

$table->integer('role_key')->unsigned();
Alexandre #lbac, il y a 10 ans

non c'est bon c'est tout ce que tu as à faire ;)

alexisgeneau, il y a 10 ans

Alors je ne comprends pas pourquoi j'obtiens cette erreur..

alexisgeneau, il y a 10 ans

En revanche, si je met 'id' en clé étrangère, ça fonctionne très bien.

Alexandre #lbac, il y a 10 ans

Ha pardon, c'est normale, une clé étrangère fait référence à un identifiant unique

alexisgeneau, il y a 10 ans

meme si j'ai défini 'key' comme unique, ça ne fonctionnera pas ?

Alexandre #lbac, il y a 10 ans

Parce que clé est défini comme unique mais pas comme uné cle primaire

alexisgeneau, il y a 10 ans

Merci pour ton aide, je vais revoir ma logique afin de contourner mon problème.