Je reçois cette erreur lorsque je fais migrer un artisan php. Quelque chose ne va pas dans mes fichiers de migration? Ou est-il possible que mes modèles soient mal codés? Mais les migrations devraient fonctionner même s'il y a quelque chose qui ne va pas dans les modèles?
[Exception]
SQLSTATE[HY000]: General error: 1005 Can't create table 'festival_aid.#sql-
16643_2033' (errno: 150) (SQL: alter table `gigs` add constraint gigs_band_
id_foreign foreign key (`band_id`) references `bands` (`band_id`) on delete
cascade) (Bindings: array (
))
[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table 'festival_aid.#sql-
16643_2033' (errno: 150)
migration des concerts
public function up()
{
Schema::create('gigs', function($table)
{
$table->increments('gig_id');
$table->dateTime('gig_startdate');
$table->integer('band_id')->unsigned();
$table->integer('stage_id')->unsigned();
$table->foreign('band_id')
->references('band_id')->on('bands')
->onDelete('cascade');
$table->foreign('stage_id')
->references('stage_id')->on('stages')
->onDelete('cascade');
});
public function down()
{
Schema::table('gigs', function($table)
{
Schema::drop('gigs');
$table->dropForeign('gigs_band_id_foreign');
$table->dropForeign('gigs_stage_id_foreign');
});
}
migration des bandes
public function up()
{
Schema::create('bands', function($table)
{
$table->increments('band_id');
$table->string('band_name');
$table->text('band_members');
$table->string('band_genre');
$table->dateTime('band_startdate');
});
}
public function down()
{
Schema::table('bands', function(Blueprint $table)
{
Schema::drop('bands');
});
}
Bande Modèle
<?php
class Band extends Eloquent {
protected $primaryKey = 'band_id';
public function gig()
{
return $this->hasOne('Gig', 'band_id', 'band_id');
}
}
Modèle Gig
<?php
class Gig extends Eloquent {
protected $primaryKey = 'gig_id';
public function gig()
{
return $this->belongsTo('Band', 'band_id', 'band_id');
}
public function stage()
{
return $this->belongsTo('Stage', 'stage_id', 'stage_id');
}
}
Vous devez d'abord créer la table, puis créer les clés étrangères:
Schema::create('gigs', function($table)
{
$table->increments('gig_id');
$table->dateTime('gig_startdate');
$table->integer('band_id')->unsigned();
$table->integer('stage_id')->unsigned();
});
Schema::table('gigs', function($table)
{
$table->foreign('band_id')
->references('band_id')->on('bands')
->onDelete('cascade');
$table->foreign('stage_id')
->references('stage_id')->on('stages')
->onDelete('cascade');
});
Et votre table bands
doit migrer en premier, puisque gigs
le référence.
Bien que cela ne s'applique pas à OP, d'autres pourraient avoir ce problème:
Au bas de la Laravel Schema Docs :
Remarque: lors de la création d'une clé étrangère faisant référence à un entier incrémentiel, n'oubliez pas de toujours laisser la colonne de clé étrangère non signée.
Vous pouvez le faire via $table->integer('user_id')->unsigned();
lors de la création de votre table dans le fichier de migration.
Il m'a fallu quelques minutes pour comprendre ce qui se passait.
Pour ceux que les autres réponses ne permettent pas de résoudre, la même erreur est également générée lorsque vous essayez d'utiliser l'action 'SET_NULL'
sur une colonne non Nullable.
Comme dit par Andrew en faisant la référence sur la table comme ceci:
$table->integer('user_id')->unsigned();
Ça devrait marcher.
Cela semble être une erreur générale liée à un problème de clé étrangère. Pour moi, je l'ai eu lorsque j'ai changé les arguments dans les méthodes references
et on
. J'ai eu:
$table->foreign('user_id')->references('users')->on('id');
au lieu de:
$table->foreign('user_id')->references('id')->on('users');
Je viens de résoudre ce problème en faisant remarquer à Laravel que le champ est unique using unique()
.
Exemple:
Schema::create('branches', function (Blueprint $table) {
$table->increments('id');
/* This fields serves as foriegn key on functions
table and it must follow the database **key rules**
by being unique */
$table->string('branch_code')->unique();
$table->string('branch_name');
$table->string('branch_address');
$table->timestamps();
});
Tableau des fonctions:
Schema::create('functions', function (Blueprint $table) {
$table->increments('id');
$table->string('branch_code');
$table->string('function');
$table->timestamps();
//Reference to branch_code on branches table
$table->foreign('branch_code')->references('branch_code')->on('branches');
});
pour ceux qui ont toujours ce problème, assurez-vous que le champ que vous définissez comme clé étrangère est une clé primaire ou doit être unique, car une clé étrangère ne peut être qu'un champ principal ou unique. voir exemple ci-dessous
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username',25)->unique();
});
Schema::create('another_table', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 25);
$table->foreign('name')->references('username')->on('users')
});
J'ai changé dans config/database 'engine' => 'InnoDB',
à 'engine' => null,
et fonctionne