2010-08-24 10 views

Respuesta

9

No encontré una manera fácil de hacer esto usando el ORM, pero tengo una solución.
Este es mi código para cualquier persona que pueda encontrar el mismo problema conmigo.

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

así es como me funciona, si alguno de ustedes tiene una alternativa mejor, no dude en publicarla aquí. – leonardys

+0

Creo que esta es la forma en que debería hacerse. También tenga en cuenta que en lugar de 'array_merge()' puede usar el ayudante Array: '$ results = Arr :: merge ($ staffs, $ managers);'. Saludos cordiales. –

1

¿Debería crear un método ORM diferente para ello? Algo como este código:

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 es una matriz role_id (¡no los nombres!). PS. No recuerdo cómo consultar 'WHERE IN', así que uso expresiones DB.

+0

La consulta SQL manual siempre está disponible, pero pensé antes que ORM puede resolver ese problema de la caja. No tengo muchas experiencias con el generador de consultas, lo analizo. Gracias por la respuesta alternativa. – leonardys

+0

Como puede ver, mi código usa $ this -> _ has_many ['roles'] configuraciones, por lo que si cambia el modelo relacionado o la clave foreign_key, este método funcionará sin ninguna modificación (en lugar de simples consultas SQL). – biakaveron

+0

¿'' -> donde ($ this -> _ primary_key, 'IN', $ ids) 'no funciona? –

Cuestiones relacionadas