如何在Laravel中覆盖软删除

3

我希望能够清空我的种子表,但是有些表会受到外键的限制,而且还有一些表启用了软删除。

为了解决无法基于软删除截断表的问题,我只是通过对每个模型使用“foreach Model::all() delete”来删除该模型。也许有更好的方法吗?但对于启用软删除的表,这并没有实际删除记录。在我想要删除记录时,如何跳过软删除?

3个回答

7
您需要使用forceDelete方法。
Model::where('condition')->where('may be other condition')->forceDelete();

或在特定的模型实例上:
$modelInstance = Model::find($id);
$modelInstance->forceDelete();

1
在您的DatabaseSeeder.php中设置一条语句以禁用外键检查和模型保护:
class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        // Disable foreign key check for this connection before running seeders
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $this->call(UserTableSeeder::class);

        // Enable foreign check after seeding.
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');

        Model::reguard();
    }
}

要强制删除软删除模型,请使用$model->forceDelete()而不是$model->delete()

1

这是我通常的做法:

在我的迁移文件中,

public function run() {
  DB::statement('SET FOREIGN_KEY_CHECKS=0;');
  DB::table('users')->truncate();

  // Create the table structure

  DB::statement('SET FOREIGN_KEY_CHECKS=0;');

  }

这基本上是强制删除表,忽略外键约束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接