2017-02-23 35 views
3

Я пытаюсь удалить 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(Illuminate\Database\Eloquent\SoftDeletingScope::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.

+0

Я знаю, это звучит глупо, но можете ли вы попытаться связать вызовы типа '$ builder-> method() -> method() etc'? – TheFallen

+0

Спасибо за ваш комментарий, но решение @devk сработало;) – Tim

ответ

1

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

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

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

+0

Мне это легко. Я думал, что ничего хорошего не получится, если вы удалите все глобальные области при добавлении одного. – Tim

Смежные вопросы