[Laravel]Eloquent ORM Global Scopes(Soft Deleting)

Laravel Eloquent ORM中有 Soft Deleted 機制,刪除時並不會直接刪除 DB 中的 record,而是在 deleted_at 紀錄 timestamp。

但是在使用 Model 時,都要多寫一個 query 來判斷 deleted_at 是否存在來判斷該 record 是否被刪除。就算在 Model 中寫 Query Scopes 也必須做這個判斷,這時候就可以透過 Eloquent 中的 Global Scopes 預設讓 Model 不會存取到已被標記刪除的 record 。

使用方法其實很簡單,只要use 一個 Eloquent 內建的 Trait 即可。

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Member extends Eloquent {
    // Use Eloquent SoftDeletingTrait
    use SoftDeletingTrait;

    protected $table = 'member';
    protected $primaryKey = 'id';
    public $timestamps = false;
}

這邊說明一下原理:
SoftDeletingTrait 是在 Illuminate\Database\Eloquent 中,在使用 Model 時會呼叫 bootSoftDeletingTrait(),這個方法會加入一個叫 SoftDeletingScope 的 Group Scope

trait SoftDeletingTrait {

    /**
     * Boot the soft deleting trait for a model.
     *
     * @return void
     */
    public static function bootSoftDeletingTrait()
    {
        static::addGlobalScope(new SoftDeletingScope);
    }
}

SoftDeletingScope

class SoftDeletingScope implements ScopeInterface {

    /**
     * 這個 Scope 就會讓 Builder 繼承 Delete 相關的處理
     *
     * 
     */
}

[AngularJS]ngChecked