Laravel: как «отключить» глобальную область видимости, чтобы включить в запрос «неактивные» объекты? ⇐ Php
-
Anonymous
Laravel: как «отключить» глобальную область видимости, чтобы включить в запрос «неактивные» объекты?
У меня проблемы с глобальными областями, особенно с удалением области.
В моей модели пользователя у меня есть ActivatedUsersTrait, который представляет глобальную область действия для запроса только тех пользователей, у которых в столбце «активировано» установлено значение true (пользователь «активируется» после проверки электронной почты).
Пока все работает нормально, когда я запрашиваю User::all(), я получаю только пользователей с активированным = true.
Моя проблема теперь в том, как включить неактивированных пользователей в мой запрос, как это делает SoftDeletingTrait через withTrashed()? Это актуально только для моего ActivationController, где мне нужно получить пользователя, установить active=true и сохранить его обратно в базу данных.
Я создал метод withInactive() в своем ActiveUsersTrait на основе метода, который я нашел в SoftDeletingTrait, но когда я запускаю запрос к User::withInactive->get(), неактивированные пользователи не будут отображаться в результатах.
Вот мой ActiveUsersTrait: use PB\Scopes\ActiveUsersScope; черта ActiveUsersTrait { публичная статическая функция bootActiveUsersTrait() { static::addGlobalScope (новый ActiveUsersScope); } публичная статическая функция withInactive() { // dd(новая статика); return (новый статический) -> newQueryWithoutScope (новый ActiveUsersScope); } публичная функция getActivatedColumn() { вернуть «активировано»; } публичная функция getQualifiedActivatedColumn() { return $this->getTable().'.'.$this->getActivatedColumn(); } } и мой ActiveUsersScope:
use Illuminate\Database\Eloquent\ScopeInterface; используйте Illuminate\Database\Eloquent\Builder; класс ActiveUsersScope реализует ScopeInterface { публичная функция Apply (Builder $builder) { $модель = $builder->getModel(); $builder->where($model->getQualifiedActivatedColumn(), true); } публичная функция удаления (Builder $builder) { $column = $builder->getModel()->getQualifiedActivatedColumn(); $query = $builder->getQuery(); foreach ((массив) $query->wheres как $key => $where) { если ($this->isActiveUsersConstraint($where, $column)) { unset($query->wheres[$key]); $query->wheres = array_values($query->wheres); } } } защищенная функция isActiveUsersConstraint (массив $where, $column) { return $where['type'] == 'Basic' && $where['column'] == $column; } } Любая помощь приветствуется!
Заранее спасибо! -Джозеф
У меня проблемы с глобальными областями, особенно с удалением области.
В моей модели пользователя у меня есть ActivatedUsersTrait, который представляет глобальную область действия для запроса только тех пользователей, у которых в столбце «активировано» установлено значение true (пользователь «активируется» после проверки электронной почты).
Пока все работает нормально, когда я запрашиваю User::all(), я получаю только пользователей с активированным = true.
Моя проблема теперь в том, как включить неактивированных пользователей в мой запрос, как это делает SoftDeletingTrait через withTrashed()? Это актуально только для моего ActivationController, где мне нужно получить пользователя, установить active=true и сохранить его обратно в базу данных.
Я создал метод withInactive() в своем ActiveUsersTrait на основе метода, который я нашел в SoftDeletingTrait, но когда я запускаю запрос к User::withInactive->get(), неактивированные пользователи не будут отображаться в результатах.
Вот мой ActiveUsersTrait: use PB\Scopes\ActiveUsersScope; черта ActiveUsersTrait { публичная статическая функция bootActiveUsersTrait() { static::addGlobalScope (новый ActiveUsersScope); } публичная статическая функция withInactive() { // dd(новая статика); return (новый статический) -> newQueryWithoutScope (новый ActiveUsersScope); } публичная функция getActivatedColumn() { вернуть «активировано»; } публичная функция getQualifiedActivatedColumn() { return $this->getTable().'.'.$this->getActivatedColumn(); } } и мой ActiveUsersScope:
use Illuminate\Database\Eloquent\ScopeInterface; используйте Illuminate\Database\Eloquent\Builder; класс ActiveUsersScope реализует ScopeInterface { публичная функция Apply (Builder $builder) { $модель = $builder->getModel(); $builder->where($model->getQualifiedActivatedColumn(), true); } публичная функция удаления (Builder $builder) { $column = $builder->getModel()->getQualifiedActivatedColumn(); $query = $builder->getQuery(); foreach ((массив) $query->wheres как $key => $where) { если ($this->isActiveUsersConstraint($where, $column)) { unset($query->wheres[$key]); $query->wheres = array_values($query->wheres); } } } защищенная функция isActiveUsersConstraint (массив $where, $column) { return $where['type'] == 'Basic' && $where['column'] == $column; } } Любая помощь приветствуется!
Заранее спасибо! -Джозеф
Мобильная версия