2015-02-24 20 views
0

我發現laravel Eloquent ORM中的軟刪除只是用時間戳替換deleted_at列中的空值。在使用軟刪除查詢表時,它是檢查deleted_at是否爲空,還是真的將該值與當前時間進行比較?是否可以在laravel中執行「將來」軟刪除?

我在問我是否能夠通過在deleted_at列上設置未來時間來執行時間表刪除。

+0

時間戳的deleted_at列內把簡直是當它被軟刪除的時間戳。因此,對軟啓用模型的整體查詢只需檢查該列是否爲空。 – 2015-02-24 11:52:22

回答

2

Laravel只檢查是否deleted_at不是NULLSoftDeletingScope

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

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

    $this->extend($builder); 
} 

你可以改變,通過創建自己的SoftDeletingScopeSoftDeletingTrait(這就是所謂的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; 
+0

謝謝。這比我預期的要多。我想知道的只是如果有可能,我寧願在我的表中添加一個列/在我的數據庫中添加一個日程表,而不是混淆原始的軟刪除類。 – cytsunny 2015-02-25 02:30:12

+0

不客氣。擴展和重寫並不完全是「與原始類相混淆」,但如果您對此感到不舒服......當然,請創建您自己的列和範圍:) – lukasgeiter 2015-02-25 05:42:50

相關問題