laravel migration添加外键的最佳方法

问题描述 投票:11回答:5

简单的问题:我是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')

最好的方法是什么?

laravel foreign-keys migration
5个回答
20
投票

首先,你必须使你的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');

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

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

您还可以为约束的“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系列。这对初学者来说是一个很好的指南。


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

1
投票

如果要添加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');
    });
}

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');

});
© www.soinside.com 2019 - 2024. All rights reserved.