Я получаю эту ошибку, когда выполняю миграцию php-artisan. Что-то не так в моих файлах миграции? Или возможно, мои модели ошибочно закодированы? Но миграция должна работать, даже в моделях что-то не так?
[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)
миграция концертов
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'); }); }
миграция групп
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'); }); }
Модельная группа
<?php class Band extends Eloquent { protected $primaryKey = 'band_id'; public function gig() { return $this->hasOne('Gig', 'band_id', 'band_id'); } }
Модель 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'); } }
Сначала вы должны создать таблицу, а затем создать внешние ключи:
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'); });
И таблица ваших bands
должна мигрировать сначала, так как gigs
ссылаются на нее.
Хотя это не относится к OP, другие могут иметь эту проблему:
Из нижней части документа Laravel Schema :
Примечание. При создании внешнего ключа, который ссылается на добавочное целое число, не забудьте всегда сделать столбец внешнего ключа неподписанным.
Вы можете сделать это через $table->integer('user_id')->unsigned();
при создании таблицы в файле миграции.
Мне потребовалось несколько минут, чтобы понять, что происходит.
Для тех, кому другие ответы не помогают, такая же ошибка возникает и при попытке использовать действие 'SET_NULL'
для столбца с недействительными значениями.
Как сказал Андрей , сделав ссылку на таблицу следующим образом:
$table->integer('user_id')->unsigned();
Он должен работать.
Это, по-видимому, является общей проблемой внешнего ключа. Для меня я получил его, когда я переключил аргументы в references
и методах. Я имел:
$table->foreign('user_id')->references('users')->on('id');
вместо:
$table->foreign('user_id')->references('id')->on('users');