Вот пример таблицы базы данных (users
):
id - int(11) auto_increment
name - varchar(100)
banned - int(1)
Столбец banned
— это логическое значение, которое по умолчанию равно 0
(false
). Если пользователь был забанен, значение равно 1
.
Я хочу исключить всех заблокированных пользователей из всех запросов по умолчанию. Я мог бы создать область запроса и затем использовать ее везде. Тем не менее, я бы предпочел просто включить эту проверку по умолчанию.
Я также мог бы создать собственный 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 кажется вам подходящим. - person alexrussell   schedule 16.02.2014