我发现laravel Eloquent ORM中的软删除只是将deleted_at列中的null替换为时间戳。使用软删除查询表时,是仅检查deleted_at是否为空,还是将值与当前时间进行比较?
我想通过在deleted_at列上设置未来时间来查看我是否能够执行计划删除。
答案 0 :(得分:4)
Laravel仅检查deleted_at
是否不是NULL
。 SoftDeletingScope
:
public function apply(Builder $builder)
{
$model = $builder->getModel();
$builder->whereNull($model->getQualifiedDeletedAtColumn());
$this->extend($builder);
}
您可以通过创建自己的SoftDeletingScope
和SoftDeletingTrait
(在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()
方法),您必须覆盖更多原始范围类。至少也是isSoftDeleteConstraint
,但我会把它留给你。
最后,您只需要切换模型中使用的特性:
use MySoftDeletingTrait;