3
votes

La contrainte de clé étrangère est mal formée - Laravel

Je suis sur Laravel 5.8 sur une pile XAMPP.


Considérez ces deux migrations pour créer deux tables:

table post_categories.

Schema::create('posts', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->string('name');
  $table->string('slug');
  $table->mediumText('description');
  $table->integer('views');
  $table->integer('post_category_id')->unsigned();
  $table->integer('user_id')->unsigned();
  $table->timestamps();

  $table->foreign('post_category_id')->references('id')->on('post_categories');
});
  • php artisan migrate
  • php artisan migrate: frais

J'ai également essayé de changer le champ post_category_id en un entier normal, au lieu de unsigned: aucune différence.

Également redémarré le serveur MySQL et le service Apache, n'a pas ça ne fait aucune différence.

La migration post_categories s'exécute avant la migration posts . La table posts est créée, mais pas la clé étrangère.


Pourquoi cette erreur est-elle générée et comment la résoudre? Strong >


3 commentaires

Vérifiez l'ordre de vos migrations. Dans ce cas, 'post_categories' devrait aller avant 'posts' ... Enfin essayez d'ajouter une clé étrangère lors de la prochaine migration, tout en gardant les types d'identifiants référencés identiques ...


Mon commentaire n'a rien à voir avec votre problème, mais vous avez oublié de faire référence au FK user_id lors de votre migration


@LucasPiazzi, oui je l'ai déjà ajouté, merci.


3 Réponses :


10
votes

Cela peut se produire parce que vous essayez de créer une clé étrangère avec un champ entier vers un grand champ entier. Dans la migration de vos messages, au lieu de ce

$table->bigInteger('post_category_id')->unsigned();

, procédez comme suit:

$table->integer('post_category_id')->unsigned();


1 commentaires

Cela a résolu le problème, je n'ai même pas remarqué le champ bigIncrements. C'était juste des incréments dans les anciennes versions de Laravel, de toute façon, merci!



0
votes

Au lieu de ceci:

$table->unsignedBigInteger('post_category_id');

Essayez ceci:

$table->integer('post_category_id')->unsigned();


0 commentaires

0
votes

J'ai eu la même erreur où je voulais lier deux tables, tables d'utilisateurs et tables de dépôts. J'ai essayé de nombreuses options mais elles n'ont pas fonctionné. Cependant, c'est ce qui a fonctionné pour moi lors de la création de la migration des dépôts:

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');


0 commentaires