應用 Laravel 的軟刪除你需要注意的幾點

寫PHP的老王發表於2019-08-23

Laravel 軟刪除存在的問題

1、軟刪除使用的標記型別是時間型別,透過is null條件查詢,刪除標記取值不支援定義

//Illuminate\Database\Eloquent\SoftDeletingScope

public function apply(Builder $builder, Model $model)
{
    $builder->whereNull($model->getQualifiedDeletedAtColumn());
}

3、軟刪除trait使用之後,不會對欄位是否存在進行校驗。對應已經存在的表,有些表存在軟刪除,有些表不存在軟刪除欄位,如果要應用軟刪除,只能在需要應用的model中一個個新增trait

如果重寫Illuminate\Database\Eloquent\SoftDeletestrait,如果類常量DELETED_AT為null,則不執行相應的軟刪除操作

4、join操作,只會在對當前模型新增軟刪除查詢條件

5、在belonsToMany關聯關係中,如果關聯表,中間表,被關聯表都有軟刪除欄位,查詢關聯關係,不會對中間表應用軟刪除條件

belonsToMany中的中間表是傳入的表名引數,天然沒辦法獲取中間表是否需要應用軟刪除。被關聯表是一個類物件,如果應用了軟刪除,則會自動附加上軟刪除條件

6、在hasManyThrough關聯關係中,如果關聯表,中間表,被關聯表都有軟刪除欄位,查詢關聯關係,會對中間表應用刪除條件。但是,如果要查詢包含已刪除的關聯關係,中間表的刪除標記條件不會去除。

hasManyThrough中,中間表是透過中間物件傳入,可以獲取到中間表是否應用軟刪除。但是中間表的軟刪除不是透過scope實現的,關聯關係物件在建立的時候就已經把中間表的軟刪除條件附加上去了,因此,即使指定了withTrashed,也會有中間表的軟刪除查詢條件。

如果要修改,也可以,透過scope的方式附加軟刪除條件,這樣就能保證軟刪除的查詢條件是在真正查詢的時候才附加上去。

從上面可以看出,Laravel的軟刪除,在關聯關係中會造成一些查詢上條件的歧義,非常容易產生bug.而且,belongsToMany中間表的問題是無解的。

轉載自 公眾號【寫 PHP 的老王】

本作品採用《CC 協議》,轉載必須註明作者和本文連結
寫PHP的老王

相關文章