2010-08-24 19 views

Répondre

9

Je n'ai pas trouvé un moyen facile de le faire en utilisant l'ORM, mais j'ai une solution de contournement.
Ceci est mon code pour tous ceux qui pourraient rencontrer le même problème avec moi.

// 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

Voici comment cela fonctionne pour moi, si l'un de vous a une meilleure alternative, n'hésitez pas à le poster ici. – leonardys

+0

Je crois que c'est comme ça que ça doit être fait. Notez aussi qu'à la place de 'array_merge()' vous pouvez utiliser l'assistant Array: '$ results = Arr :: merge ($ staffs, $ managers);'. Sincères amitiés. –

1

Peut-être devriez-vous créer une méthode ORM distincte pour cela? Quelque chose comme ce code:

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(); 
} 

$ roles est un tableau role_id (pas les noms!). PS. Je ne me souviens pas comment interroger 'WHERE IN', donc j'utilise des expressions DB.

+0

La requête sql manuelle est toujours disponible, mais je pensais avant que ORM peut résoudre ce problème hors de la boîte. Je n'ai pas beaucoup d'expériences avec le constructeur de requête, je l'examine. Merci pour la réponse alternative. – leonardys

+0

Comme vous pouvez le voir, mon code utilise les paramètres $ this -> _ has_many ['roles'], donc si vous changez le modèle associé ou foreign_key, cette méthode fonctionnera sans aucune modification (au lieu de requêtes SQL). – biakaveron

+0

Est-ce que '-> where ($ this -> _ primary_key, 'IN', $ ids)' ne fonctionne pas? –