将外键添加到迁移(Laravel)
Posted
技术标签:
【中文标题】将外键添加到迁移(Laravel)【英文标题】:Add foreign key to a migration (Laravel) 【发布时间】:2020-03-13 22:53:31 【问题描述】:我花了一整天的时间试图弄清楚接下来的迁移发生了什么。
这是表的迁移。我的想法是使用 'id_stays_abroad' 和 'user_id' 作为外键。
class CreateBookingStaysAbroad extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('booking__stays__abroads', function (Blueprint $table)
$table->bigIncrements('id');
$table->timestamps();
$table->unsignedInteger('id_stays_abroad')->nullable();
$table->unsignedInteger('user_id')->nullable();
$table->string('status')->nullable();
$table->date('departure_date');
$table->date('return_date');
$table->integer('number_weeks');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('booking__stays__abroad');
这是添加外键的另一个迁移
class AddForeignKeyBookingStaysAbroadTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::table('booking__stays__abroads', function($table)
$table->foreign('id_stays_abroad')
->references('id')
->on('stays_abroads');
$table->foreign('user_id')
->references('id')
->on('users');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::table('booking__stays__abroads', function (Blueprint $table)
$table->dropForeign('booking__stays__abroads_id_stays_abroad_foreign');
$table->dropForeign('booking__stays__abroads_user_id_foreign');
);
当我运行 php artisan migrate 时出现以下错误:
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束(SQL:alter table booking__stays__abroads
添加约束booking__stays__abroads_id_stays_abroad_foreign
外键(id_stays_abroad
)引用stays_abroads
(id
))
提前谢谢各位。
【问题讨论】:
有问题的 2 列的类型和长度是否相同?表id_stays_abroad
存在吗?
你能展示你的stays_abroads
迁移吗?
改用$table->unsignedBigInteger('id_stays_abroad')->nullable();
和$table->unsignedBigInteger('user_id')->nullable();
,我不认为unsignedInteger
和bigIncrements
在SQL 中是相同的数据类型。
【参考方案1】:
试试这个,我认为你在用户表中的 id 是 bigIncrements.so for foreignkey 使用这个
$table->unsignedBigInteger('id_stays_abroad')->nullable();
$table->unsignedBigInteger('user_id')->nullable();
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
Schema::table('booking__stays__abroads', function($table)
$table->foreign('id_stays_abroad')
->references('id')
->on('stays_abroads');
$table->foreign('user_id')
->references('id')
->on('users');
);
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
Schema::table('booking__stays__abroads', function (Blueprint $table)
$table->dropForeign('booking__stays__abroads_id_stays_abroad_foreign');
$table->dropForeign('booking__stays__abroads_user_id_foreign');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
【讨论】:
非常感谢,但不幸的是我遇到了这个错误:PDOException::("SQLSTATE[HY000]: General error: 1825 Failed to add the foreign key constraint on table 'booking__stays__abroads'。不正确FOREIGN KEY 约束中的选项 'hr@002denglish/booking__stays__abroads_id_stays_abroad_foreign'")【参考方案2】:您没有为id
和id_stays_abroad
使用相同的列定义。使用unsignedBigInteger
而不是unsignedInteger
。
$table->unsignedBigInteger('id_stays_abroad')->nullable();
$table->unsignedBigInteger('user_id')->nullable();
【讨论】:
一般错误:1825 无法在表 'booking__stays__abroads' 上添加外键约束。 FOREIGN KEY 约束中的选项不正确 'hr@002denglish/booking__stays__abroads_user_id_foreign'") 我遇到了这个错误。感谢您的帮助。 @NoelIñiguez 您必须更新两个外键。不止一个。看看我的更新。 你是对的。太感谢了。我真的很感激它。 @NoelIñiguez 没问题,你可以接受我在左边的回答。谢谢。【参考方案3】:首先,属性应该命名为stays_abroad_id
,而不是id_stays_abroad
。
问题在于stays_abroads.id
和stays_abroid_id
的大小和性质应该匹配(在这种情况下为无符号大整数)。
此外,您不需要数据透视表中的 ID。你不会在 laravel 中为它声明模型。
表的名称应反映数据透视表的两侧,因此将其命名为stays_abroad_user
(单数和字母顺序用下划线分隔)
class CreateBookingStaysAbroad extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::create('stays_abroad_user', function (Blueprint $table)
$table->unsignedBigInteger('stays_abroad_id')->nullable();
$table->unsignedBigInteger('user_id')->nullable();
$table->string('status')->nullable();
$table->date('departure_date');
$table->date('return_date');
$table->integer('number_weeks');
$table->timestamps();
$table->foreign('stays_abroad_id')
->references('id')
->on('stays_abroads');
$table->foreign('user_id')
->references('id')
->on('users');
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('stays_abroad_user');
【讨论】:
【参考方案4】:我对 Laravel 也很陌生,但我认为您可能需要更改这两种数据类型:
$table->unsignedInteger('id_stays_abroad')->nullable();
$table->unsignedInteger('user_id')->nullable();
到
$table->unsignedBigInteger('id_stays_abroad')->nullable();
$table->unsignedBigInteger('user_id')->nullable();
值得一试!
【讨论】:
以上是关于将外键添加到迁移(Laravel)的主要内容,如果未能解决你的问题,请参考以下文章