LoginSignup
0
0

More than 1 year has passed since last update.

LaravelのwithoutGlobalScopes()ってSoftDeleteも消えるの盲点だった・・・

Posted at

いろいろカスタムしてグローバルスコープでややこしいクエリも少ない記述で効率化なんてことをしてたんですが、時にはそれを打ち消したい時も。
いちいち消したいものを書くのもめんどくさく、一気に withoutGlobalScopes() って書いてました。
そうすると論理削除したものが取得されてるってことにテストで気づきました。
SoftDeleteもグローバルスコープ経由なので当然っちゃ当然でした。

なのでSoftDelete以外のグローバルスコープを一気に無効化する方法を作りました。

    public function scopeWithoutGlobalScopesWithSoftDelete(Builder $query): Builder
    {
        $scopes = [];
        foreach (static::getGlobalScopes() as $scope => $val) {
            if ($scope !== \Illuminate\Database\Eloquent\SoftDeletingScope::class) {
                $scopes[] = $scope;
            }
        }
        return $query->withoutGlobalScopes($scopes);
    }

このスコープを呼べばいいので Model::withoutGlobalScopesWithSoftDelete()->get();こんな感じに使う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0