2014-02-16 4 views
4

Ниже приведен пример базы данных таблицы (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.

Любая идея о том, как решить эту проблему?

+0

Насколько я знаю, переопределение 'newQuery()' действительно является единственным способом для этого. Я нашел себя в подобной ситуации, и я подумал о создании scopeBase(), который является личным соглашением (а не Laravel!) И приложил усилия, чтобы не забудьте вызвать «Model :: base() -> get () 'и т. д., когда мне нужно получить доступ к моделям. Это далеко не идеальный, но сохраняет отмену 'newQuery()'. Думаю, оба они плохи по-своему. Ответ JohnTaa кажется, что это сработает для вас. – alexrussell

+1

Сделал некоторые копания. Вы можете применять глобальные области действия [например, это] (https://github.com/laravel/framework/issues/3897#issuecomment-41351443). Примером, который я даю, является использование повторно используемых областей; вам может не понадобиться, так как только пользователи могут быть запрещены. – mpen

ответ

0

Почему бы вам не использовать переменную конфигурации для этого:

public function newQuery($excludeDeleted = true) 
{ 
    $builder = parent::newQuery($exludeDeleted); 
    if (Config::get('hide_banned_users', true) !== false) { 
     $builder->where('banned', '=', '0'); 
    } 
    return $builder; 
} 

и изменить значение конфигурации, когда вам нужно, чтобы увидеть забаненных пользователей.

1

Это очень похоже на soft deleting, но с banned_at вместо deleted_at. Если поведение по умолчанию не показывает запрещенных пользователей, я думаю, что более интуитивно понятно, чтобы я попросил запретить (например, withTrashed), когда они вам понадобятся (панель администратора).

+0

У меня такая же функциональность, как и при мягком удалении, да. –

+0

@MarttiLaine Я тоже это изучаю. Пока не найдено решения, но [это] (https://github.com/laravel/framework/blob/1181e63a49921612cf441cbad65b345ccabdcb75/src/Illuminate/Database/Eloquent/SoftDeletingTrait.php # L104-L112) может дать нам ключ. – mpen

4

Я настоятельно рекомендую использовать шаблон проектирования репозитория для запросов БД, а не выполнять прямые запросы на запросы в контроллерах и везде.

// Quick example, not tested 
class UserRepositoy { // You should create an interface and maybe super class for handling common cases like caching, find(), all() etc 

    protected $include_banned = false; 
    protected $model; 

    public function __construct() // you can use DI here 
    { 
      $this->model = new User; 
    } 

    public function setIncludeBanned($bool) 
    { 
     $this->include_banned = $bool; 
    } 

    protected function includeBanned($query) 
    { 
     if ($this->include_banned) { 
      return $query->where('banned', 1); 
     } 
    } 

    public function find($id) 
    { 
     $res = $this->model->where('id', $id); 

     $res = $this->includeBanned($res); 

     return $res->get(); 
    } 

} 

Теперь вы можете instiate класса репозитория, где когда-либо вам нужны запросы и вы унифицированы API для вызовов. В Laravel очень легко распространять небольшие нереалистичные запросы здесь и там, но в конечном итоге это будет очень неприятно, чтобы обновлять/изменять и справляться. Попробуйте googling для Laravel Design Pattern, и есть много информации и примеров. Сделал мой день пару раз уже.

Этот образец также облегчает отрывание всего Красноречивого с чем-то другим, если это необходимо.

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