我發現laravel Eloquent ORM中的軟刪除只是用時間戳替換deleted_at列中的空值。在使用軟刪除查詢表時,它是檢查deleted_at是否爲空,還是真的將該值與當前時間進行比較?是否可以在laravel中執行「將來」軟刪除?
我在問我是否能夠通過在deleted_at列上設置未來時間來執行時間表刪除。
我發現laravel Eloquent ORM中的軟刪除只是用時間戳替換deleted_at列中的空值。在使用軟刪除查詢表時,它是檢查deleted_at是否爲空,還是真的將該值與當前時間進行比較?是否可以在laravel中執行「將來」軟刪除?
我在問我是否能夠通過在deleted_at列上設置未來時間來執行時間表刪除。
Laravel只檢查是否deleted_at
不是NULL
。 SoftDeletingScope
:
public function apply(Builder $builder)
{
$model = $builder->getModel();
$builder->whereNull($model->getQualifiedDeletedAtColumn());
$this->extend($builder);
}
你可以改變,通過創建自己的SoftDeletingScope
和SoftDeletingTrait
(這就是所謂的SoftDeletes
在Laravel 5)。
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;
謝謝。這比我預期的要多。我想知道的只是如果有可能,我寧願在我的表中添加一個列/在我的數據庫中添加一個日程表,而不是混淆原始的軟刪除類。 – cytsunny 2015-02-25 02:30:12
不客氣。擴展和重寫並不完全是「與原始類相混淆」,但如果您對此感到不舒服......當然,請創建您自己的列和範圍:) – lukasgeiter 2015-02-25 05:42:50
時間戳的deleted_at列內把簡直是當它被軟刪除的時間戳。因此,對軟啓用模型的整體查詢只需檢查該列是否爲空。 – 2015-02-24 11:52:22