Удалить SoftDeletingScope как глобальную область


Я пытаюсь удалить SoftDeletingScope как глобальную область для конкретной роли пользователя. Так что это должно как-то выглядеть так:

protected static function boot()
{
    parent::boot();

    if (Auth::check()) {
        // CPOs can see deleted users
        if (Auth::user()->hasRole('cpo')) {
            static::addGlobalScope('user-cpo-deleted', function(Builder $builder) {
                // 1
                $builder->withoutGlobalScope(IlluminateDatabaseEloquentSoftDeletingScope::class);
                // 2
                $builder->withoutGlobalScopes();
                // 3
                $builder->withTrashed();
                // 4
                $builder->where('id', '>=', 1);
            });
        }
    }
}
Я попробовал решение 1-3 и, чтобы убедиться, что метод вызывается вообще, 4. Я протоколировал SQL-запросы и увидел, что вызывается 4, но не 3 ранее (если быть точным, методы не удалили часть users.deleted_at is null). Я пробовал их по отдельности и все вместе.

Я знаю, что могу сделать что-то вроде этого $users = User::withTrashed()->get();, что работает, но это было бы не совсем безопасно, потому что Я должен был бы найти каждое место, где пользователи могут быть запрошены, и обернуть это в Оператор if.

1 3

1 ответ:

Я не знаю более простого решения, чем переопределение bootSoftDeletes() из softdeletes trait с чем-то вроде этого:

public static function bootSoftDeletes()
{
    if (!Auth::check() || !Auth::user()->hasRole('cpo')) {
        static::addGlobalScope(new SoftDeletingScope);
    }
}

Добавление и удаление глобальных областей на лету иногда приводит к некоторому странному поведению: /