如何在Laravel 5.8 Eloquent模型中禁用软删除功能

3
在我的项目中,所有的模型都继承了BaseModel类,该类默认使用SoftDeletes特性。但在某些特殊情况下,例如在ShouldHardDelete类中,我不希望我的数据库记录被软删除。假设我不能拒绝继承BaseModel
为了防止ShouldHardDelete类使用软删除,我需要做哪些更改?

出于好奇,为什么您想要完全删除记录? - usrNotFound
@usrNotFound,我需要插入和删除多条记录(不能简单地更改它们,逻辑太复杂)。对于这些记录来说,软删除并不是非常必要的,将已删除的记录保留在数据库中会浪费太多磁盘空间。 - vvmul
我认为 $modal->forceDelete() 可以完成这项工作。 - usrNotFound
那是一个选项,但是如果我想要删除这些对象以及其他可软删除的对象,那么我就需要进行一些特殊的处理。 - vvmul
2个回答

8

你需要完成两件事情:

  1. SoftDeletes trait 中有一个名为 bootSoftDeletes() 的静态方法,用于初始化模型的软删除行为:
    /**
     * Boot the soft deleting trait for a model.
     *
     * @return void
     */
    public static function bootSoftDeletes()
    {
        static::addGlobalScope(new SoftDeletingScope);
    }

ShouldHardDelete类中重写为空方法:

    /**
     * Disable soft deletes for this model
     */
    public static function bootSoftDeletes() {}
  1. ShouldHardDelete中将$forceDeleting字段设置为true
    protected $forceDeleting = true;

因此,您可以禁用软删除行为,同时仍然扩展使用SoftDeletes特征的BaseModel

3

如果您正在使用softDelete trait,但不想在特定查询中使用它,则可以在模型中使用withoutGlobalScope方法。

User::withoutGlobalScope(Illuminate\Database\Eloquent\SoftDeletingScope::class)->get();

如果您想为特定查询使用多个模型,则最好在AppServiceProvider中扩展Eloquent Builder。

public function boot()
{
   Builder::macro('withoutSoftDeletingScope', function () {
     $this->withoutGlobalScope(Illuminate\Database\Eloquent\SoftDeletingScope::class);

       return $this;
    });
 }

然后您可以在任何模型中调用它作为方法

User::withoutSoftDeletingScope()->get();

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