是否可以在 laravel 中执行 "future" 软删除?

Is it possible to perform "future" soft delete in laravel?

我发现 laravel Eloquent ORM 中的软删除只是用时间戳替换 deleted_at 列中的空值。软删除查询table时,只是检查deleted_at是否为null,还是真的在比较当前时间的值?

我想看看是否可以通过在 deleted_at 列上设置未来时间来执行计划删除。

Laravel 仅检查 deleted_at 是否不是 NULLSoftDeletingScope:

public function apply(Builder $builder)
{
    $model = $builder->getModel();

    $builder->whereNull($model->getQualifiedDeletedAtColumn());

    $this->extend($builder);
}

您可以通过创建自己的 SoftDeletingScopeSoftDeletingTrait(在 Laravel 5 中称为 SoftDeletes)来更改它。

trait MySoftDeletingTrait {
    use Illuminate\Database\Eloquent\SoftDeletingTrait;

    public static function bootSoftDeletingTrait()
    {
        static::addGlobalScope(new MySoftDeletingScope);
    }
}

class MySoftDeletingScope extends Illuminate\Database\Eloquent\SoftDeletingScope {
    public function apply(Builder $builder)
    {
        $model = $builder->getModel();

        $builder->where($model->getQualifiedDeletedAtColumn(), '<=', Carbon::now());

        $this->extend($builder);
    }
}

注意 要删除范围(remove() 方法),您必须覆盖更多原始范围class。至少也是 isSoftDeleteConstraint,但我会把它留给你。

最后你只需要切换掉你在模型中使用的特征:

use MySoftDeletingTrait;