将外键添加到迁移(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_abroadsid))

提前谢谢各位。

【问题讨论】:

有问题的 2 列的类型和长度是否相同?表id_stays_abroad 存在吗? 你能展示你的stays_abroads迁移吗? 改用$table->unsignedBigInteger('id_stays_abroad')->nullable();$table->unsignedBigInteger('user_id')->nullable();,我不认为unsignedIntegerbigIncrements 在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】:

您没有为idid_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.idstays_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)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:无法添加外键约束

无法将外键约束添加到数据透视表

Laravel - 如何将外键用于具有识别外键的表?

使用外键添加 laravel 迁移

MySQL数据库的Laravel迁移“无法添加外键约束”错误

Laravel 迁移无法添加外键