2013-11-19 2 views
0

Я пытался понять, можно ли реализовать свойства на основе запроса в Eloquent, чтобы следующая структура данных позволяла иметь свойство is_admin в модели User, которое возвращает true10 или false в зависимости от того, назначена ли пользователю роль с именем Admin.Использовать свойство на основе запроса

Поскольку отношения в некотором смысле работают так, я решил, что это будет возможно, но как именно ускользает от меня.

users 
    int id 
    string name 

roles 
    int id 
    string name 

user_roles 
    int id 
    int user_id 
    int role_id 

ответ

0

Это непроверенный код, но я уверен, что он будет работать:

class User extends Eloquent { 

    public function roles() 
    { 
     return $this->belongsToMany('Role', 'user_roles'); 
    } 

    public function hasRole($roleName) 
    { 
     return count($this->roles()->where('name',$roleName)->get()) > 0; 
    } 

} 

И затем использовать его:

$user = User::find(1); 
if ($user->hasRole('Amdin')) 
{ 
    /// do something 
} 
+0

Как выглядит поток запросов БД при выполнении этого? Все ли работает с одним запросом до тех пор, пока выполняется запрос '-> с ('role')', даже когда вы получаете много пользователей? –

+0

Я только что понял, что Eloquent извлекает каждое ленивое загруженное отношение как отдельный запрос (один раз для 'with()', не один раз для модели). Таким образом, это работает (как и ответ ниже, который по существу идентичен), но требует загрузки дополнительных данных до определения значения. –

0

не совсем собственность, но вы могли бы реализовать метод $ user-> isAdmin() в Пользователе подобным образом:

public function isAdmin() 
{ 
    // check if the user has an admin role 
    if ($this->roles()->where('name', '=', 'Admin')->count() > 0) 
    { 
     // return true if he does 
     return true; 
    } 

    // return false if he doesn't 
    return false 
} 

В качестве альтернативы вы можете создать столбец «is_admin» в таблице «Пользователь» в виде целых чисел с длиной 1. Установите по умолчанию значение 0, если пользователь установлен в 1, тогда вы можете использовать $ user-> is_admin в булевых тестах ,

+0

работает нормально для отдельных строк, но для каждого пользователя это приведет к тому, что многие запросы БД выполняются. Мой пример для ролей, поскольку это было легче объяснить, но то, что я действительно хочу сделать, более сродни «имеет в настоящее время аутентифицированный пользователь, помеченный этим элементом». –

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