Ниже приведен пример базы данных таблицы (users
):По умолчанию для Eloquent-моделей?
id - int(11) auto_increment
name - varchar(100)
banned - int(1)
В столбце banned
это логическое значение, которое 0
(false
) по умолчанию. Если пользователь был заблокирован, значение равно 1
.
Я бы хотел, чтобы исключал всех заблокированных пользователей по всем запросам по умолчанию. Я мог бы создать query scope, а затем использовать его везде. Тем не менее, я бы предпочел просто выполнить эту проверку по умолчанию.
Я мог бы также создать newQuery
-метод моей, например, так:
// Inside User-model, which extends Eloquent
public function newQuery($excludeDeleted = true)
{
$builder = parent::newQuery($exludeDeleted);
$builder->where('banned', '=', '0');
return $builder;
}
Однако, этот способ я не смог бы отключить это поведение. Возможно, мне захочется увидеть запрещенных пользователей в моей частной панели администратора, но не сможет, поскольку это ограничение будет применено к любому запросу, выполняемому через Eloquent.
Любая идея о том, как решить эту проблему?
Насколько я знаю, переопределение 'newQuery()' действительно является единственным способом для этого. Я нашел себя в подобной ситуации, и я подумал о создании scopeBase(), который является личным соглашением (а не Laravel!) И приложил усилия, чтобы не забудьте вызвать «Model :: base() -> get () 'и т. д., когда мне нужно получить доступ к моделям. Это далеко не идеальный, но сохраняет отмену 'newQuery()'. Думаю, оба они плохи по-своему. Ответ JohnTaa кажется, что это сработает для вас. – alexrussell
Сделал некоторые копания. Вы можете применять глобальные области действия [например, это] (https://github.com/laravel/framework/issues/3897#issuecomment-41351443). Примером, который я даю, является использование повторно используемых областей; вам может не понадобиться, так как только пользователи могут быть запрещены. – mpen