質問を書いたときに多くの回答の提案を見たので、これは何度も回答されていることを知っていますが、実際にはどれも正しい回答を得られません。
新しいフィールドをテーブルに追加して、laravel で artisan migrate を使用しようとすると、エラーが発生します
General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`) references `page_status` (`status_value`))
しかし、同じことを行う前にエラーが発生しなかったのに、なぜエラーが発生するのかわかりません。考えられる唯一の答えは、同じテーブルに2つ以上の外部キーを持つことはできないということです。ここに私の移行機能があります
class CreateStatusTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('page_status', function($table) {
$table->increments('id');
$table->string('status_name');
$table->integer('status_value')->unsigned();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('page_status');
}
}
これはステータス テーブル用で、これを使用してページ テーブルに新しいフィールドを追加する必要があります。
class AddStatusToPagesTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('pages', function($table) {
$table->integer('page_status')->unsigned();
$table->foreign('page_status')->references('status_value')->on('page_status');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('pages', function($table) {
$table->dropForeign('pages_page_status_foreign');
});
}
}
そして、これがエラーが表示される場所です。何らかの理由で、page_statusフィールドの外部キーをページテーブルに設定できません。
私は自分のローカルホストで xampp インストールを使用しています。phpmyadmin では、テーブルが innodb に設定されていることがわかります。実際にはすべてがデフォルトで innodb に設定されています。page_statusフィールドを見て、ページテーブルのデータベース内で、リレーションを使用できるよりも最初にインデックスを設定する必要があります。インデックスに設定されていない理由はわかりませんが、そのテーブルには既にインデックスとしてIDがあり、外部キーとして作成者があります。
この前に、ページテーブルを作成してこれを使用するときにいくつかのフィールドも追加しました
class CreatePagesTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pages', function($table){
$table->increments('id');
$table->integer('author')->unsigned();
$table->foreign('author')->references('id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('pages');
}
}
移行を使用しても問題はありませんでした。うまく機能し、作成者は外部キーとして設定されています。
では、なぜ今新しい外部キーを追加できないのでしょうか?