2015-08-25 3 views
1

У меня есть модель AccountType, которая связана с пользовательской таблицей.Laravel 5 - ограничение записи из функции redoquent all()

public function users() 
    { 
     return $this->hasMany('App\User','account_type_id'); 
    } 

Мы построили сайт на основе ВидСчета с данными типа (обычного пользователя, Редактор, Admin) и теперь мы хотим, чтобы добавить новый тип, как SuperAdmin, который для администратора сайта. Но мы не хотим, чтобы этот тип учетной записи отображался там, где вызывается код AccountType :: all(), а также в результатах поиска пользователей. Мы использовали функцию all() в большинстве мест. Поэтому мы не хотим менять его повсюду. Есть ли способ переопределить функцию по умолчанию только для этой модели AccountType?

+0

Я не уверен, что понимаю - вы хотите, чтобы тип учетной записи SuperAdmin не возвращался при вызове AccountType :: all()? Что-нибудь еще? –

+0

Да, поскольку AccountType :: all используется во многих контроллерах, я хочу проверить, могу ли я ограничивать тип новой учетной записи из списка, когда вызывается функция all(), переопределяя функцию и проверяя идентификатор нового типа –

ответ

1

Лучший способ (не самый простой) - создать глобальный охват. Как и свойство SoftDelete, которое удаляет все удаленные объекты из ваших запросов.

Вы добавляете глобальную область действия в AccountType, чтобы навсегда удалить SuperAdmin из всех ваших запросов.

Ex: AccountType :: все() возвращает [ 'Normal User', 'Редактор']

И

AccountType :: withSuperAdmin() -> все() возвращает предыдущий массив плюс тип SuperAmin.

См: http://softonsofa.com/laravel-5-eloquent-global-scope-how-to/

Вы не должны использовать диван пакет, чтобы сделать это работает.

Откройте свойство SoftDelete и попытайтесь понять, почему это происходит.

2

Добавьте этот метод в модель AccountType. Этот метод переопределит метод Model :: all() - по умолчанию.

public static function all($columns = array('*')) 
    { 
     $columns = is_array($columns) ? $columns : func_get_args(); 

     $instance = new static; 

     return $instance->newQuery()->where('account_type', '!=', 'SuperAdmin')->get($columns); 
    } 
+0

Исходный метод all() позволяет вызывать его с несколькими аргументами, каждый из которых является именем столбца, который нужно извлечь. Вам не хватает той части, которая может разорвать приложение, если оно вызывает все(). См. Первоначальную реализацию. –

+0

@jedrzej.kurylo Нет, вы все еще можете передать массив столбцов этому методу --- например AccountType :: all (['id', 'account_type']); Единственное различие заключается в том, что этот метод не возвратит записи, в которых account_type равный SuperAdmin – user4621032

+0

Я имел в виду другой способ его вызова: AccountType :: all ('id', 'account_type') - см. недостающую нотацию массива - которая отлично работает с оригинальной реализацией –

1

Самый простой способ это просто положить SuperAdmin идентификатор в вашей конфигурации и перезаписать все() метод AccountType модель:

public static function all($columns = ['*']) 
{ 
    $columns = is_array($columns) ? $columns : func_get_args(); 
    return static::where('id', '<>', Config::get('app.super_admin_id')->get($columns); 
} 

Если вы хотите исключить SuperAdmin из всех запросов SELECT, которые выполняет ваша заявка, вы также можете проверить глобальные области применения Eloquent - примером является Характеристики SoftDeletes Вы можете прочитать здесь: http://laravel.com/docs/5.1/eloquent#soft-deleting. Это потребует гораздо большего количества кода, а также будет работать в глобальном масштабе, поэтому вам нужно будет обновить способ получения типов учетных записей, в которых вы хотите получить SuperAdmin.

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