2010-08-24 4 views
5

Я изучаю фреймворк и теперь создаю приложение, использующее его.Модуль авторизации Kohana 3, получая пользователей с ролью «staff» или «manager»

Мне нужно, чтобы все пользователи имели роль «пользователь» или «штат», но я не мог найти об этом в документации.

Помогите кому-нибудь? (Я думаю, что это больше проблема ORM в модуле auth)

ответ

9

Я не нашел простой способ сделать это с помощью ORM, но у меня есть обходное решение.
Это мой код для всех, кто может столкнуться с той же проблемой со мной.

// One for each role 
$staffs = ORM::factory('role', array('name' => 'staff'))->users->find_all()->as_array(); 
$managers = ORM::factory('role', array('name' => 'manager'))->users->find_all()->as_array(); 

// Merge the results 
$results = array_merge($staffs, $managers); 
+0

вот как это работает для меня, если у кого-то из вас есть лучшая альтернатива, вы можете отправить его здесь. – leonardys

+0

Я верю, что так оно и должно быть. Также обратите внимание, что вместо 'array_merge()' вы можете использовать помощник Array: '$ results = Arr :: merge ($ staffs, $ manager);'. С уважением. –

1

Может быть, вы должны создать для него отдельный метод ORM? Что-то вроде этого кода:

public function get_users(array $roles) 
{ 
    $users = DB::select(array($this->_has_many['roles']['foreign_key'], 'id')) 
       ->distinct(TRUE) 
       ->from($this->_has_many['roles']['through']) 
       ->where($this->_has_many['roles']['far_key'], 'IN', DB::expr('('.implode(',', $roles).')')) 
       ->execute($this->_db); 
    if (count($users) == 0) 
    { 
     // return empty list 
     return array(); 
    } 
    // now we need only IDs from result 
    $ids = array(); 
    foreach($users as $columns) 
    { 
     $ids[] = $columns['id']; 
    } 
    // load users by id 
    return $this->where($this->_primary_key, 'IN', DB::expr('('.implode(',', $ids).')'))->find_all(); 
} 

$ role - это массив role_id (а не имена!). PS. Я не помню, как запросить «WHERE IN», поэтому я использую выражения DB.

+0

Ручной SQL-запрос всегда доступен, но я думал, что ORM может решить эту проблему из коробки. У меня нет большого опыта с построителем запросов, я заглядываю в него. Спасибо за альтернативный ответ. – leonardys

+0

Как вы можете видеть, мой код использует параметры $ this -> _ has_many ['role'], поэтому, если вы измените родственную модель или foreign_key, этот метод будет работать без каких-либо изменений (вместо простых SQL-запросов). – biakaveron

+0

Does '-> где ($ this -> _ primary_key, 'IN', $ ids)' не работает? –