laravel migration添加外键的最佳方法

时间:2014-10-18 07:26:45

标签: laravel foreign-keys migration

简单的问题:我是Laravel的新手。我有这个迁移文件:

Schema::create('lists', function(Blueprint $table) {
    $table->increments('id'); 
    $table->string('title', 255);
    $table->integer('user_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->timestamps();
});

我想更新它以添加onDelete('cascade')

最好的方法是什么?

11 个答案:

答案 0 :(得分:19)

首先,您必须将user_id字段设为索引:

$table->index('user_id');

之后,您可以使用级联操作创建外键:

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

如果您希望通过新的迁移执行此操作,则必须先删除索引和外键,然后从头开始执行所有操作。

在down()函数中你必须这样做然后在up()做我上面写的:

$table->dropForeign('lists_user_id_foreign');
$table->dropIndex('lists_user_id_index');
$table->dropColumn('user_id');

答案 1 :(得分:5)

在Laravel 7中,它可以一行完成

$table->foreignId('user_id')->constrained()->cascadeOnDelete();

答案 2 :(得分:3)

您应该创建一个新的迁移文件,例如'add_user_foreign_key.php'

public function up()
{
    Schema::table('lists', function(Blueprint $table)
    {
         $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('lists', function(Blueprint $table)
    {
    $table->dropForeign('user_id'); //
    });
}  

跑步

 php artisan migrate

答案 3 :(得分:2)

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');

在此示例中,我们声明 user_id 列引用了用户表中的 id 列。确保首先创建外键列! user_id 列声明为无符号,因为它不能具有负值。

您还可以为约束的“on delete”和“on update”操作指定选项:

$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

要删除外键,您可以使用 dropForeign 方法。与其他索引一样,外键使用类似的命名约定:

$table->dropForeign('posts_user_id_foreign');

如果您对 Laravel Eloquent 还不熟悉,请尝试使用laracasts上提供的 Laravel From Scratch 系列。这对初学者来说是一个很好的指南。

答案 4 :(得分:1)

Laravel 7.x外键约束

Laravel还提供了对创建外键约束的支持,这些外键约束用于强制数据库级别的参照完整性。例如,让我们在user_id表上定义一个posts列,该列引用一个users表上的id列:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

由于此语法相当冗长,因此Laravel提供了其他的,更简短的方法,这些方法使用约定来提供更好的开发人员体验。上面的示例可以这样写:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

来源:https://laravel.com/docs/7.x/migrations

答案 5 :(得分:0)

如果要添加onDelete('cascade'),只需删除索引并再次创建它们:

public function up()
{
    Schema::table('lists', function($table)
    {
        $table->dropForeign('lists_user_id_foreign');

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

public function down()
{
    Schema::table('lists', function($table)
    {
        $table->dropForeign('lists_user_id_foreign');

        $table->foreign('user_id')->references('id')->on('users');
    });
}

答案 6 :(得分:0)

Schema::create('roles',function(Blueprint $table){

    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();

});

Schema::create('permissions',function(Blueprint $table){

    $table->unsignedBigInteger('role_id');
    $table->foreign('role_id')->references('id')->on('roles');
    $table->string('permission');

});

答案 7 :(得分:0)

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

答案 8 :(得分:0)

我在做同样的事情,但是出现错误“ id不存在” =>,所以我如下更改了迁移文件:

问题表迁移内容:

$ table-> id()=>应该更改为$ table-> increments('id')

答复表中外键的定义:

$ table-> foreign('question_id')-> references('id')-> on('questions')-> onDelete('cascade');

现在您的外键将可用。

答案 9 :(得分:0)

假设您有两个表student和section,可以参考以下两个表结构来添加外键并制作onDelete('cascade')。

表-1:

public function up()
{
    Schema::create('student', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('address');
        $table->string('phone');
        $table->string('about')->nullable();
        $table->timestamps();
    });
}

表-2:

public function up()
{
    Schema::create('section', function (Blueprint $table) {
        $table->id();
        $table->bigInteger('student_id')->unsigned()->index()->nullable();
        $table->foreign('student_id')->references('id')->on('student')->onDelete('cascade');
        $table->string('section')->nullable();
        $table->string('stream')->nulable();
        $table->timestamps();
    });
}

希望它将对您有帮助-:) 您可以从here阅读全文。

答案 10 :(得分:0)

从 Laravel 8 开始:

$table->foreignIdFor(OtherClass::class);

很简单:)

  • 确保OtherClass 迁移文件早于运行(照常按文件名日期)。
  • 如果 OtherClass id 不是自动递增的,otherclass_id 的类型将是 char 而不是 bigint,在这种情况下->

改用这个:

$table->foreignId('otherclass_id')->index()->constrained()->cascadeOnDelete();