いろいろカスタムしてグローバルスコープでややこしいクエリも少ない記述で効率化なんてことをしてたんですが、時にはそれを打ち消したい時も。
いちいち消したいものを書くのもめんどくさく、一気に 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();
こんな感じに使う。