2010-08-24 7 views

Antwort

9

Ich habe keine einfache Möglichkeit gefunden, dies mit dem ORM zu tun, aber ich habe einen Workaround.
Dies ist mein Code für jeden, der das gleiche Problem mit mir auftreten könnte.

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

so funktioniert es für mich, wenn jemand von euch eine bessere Alternative hat, fühlt sich frei, es hier zu posten. – leonardys

+0

Ich glaube, so sollte es gemacht werden. Beachten Sie auch, dass Sie anstelle von 'array_merge()' den Array-Helper verwenden können: '$ results = Arr :: merge ($ staffs, $ managers);'. Mit freundlichen Grüßen. –

1

Vielleicht sollten Sie eine separate ORM-Methode dafür erstellen? Etwas wie dieser 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(); 
} 

$ Rollen ist ein Role_id-Array (nicht Namen!). PS. Ich erinnere mich nicht, wie man 'WHERE IN' abfragt, also benutze ich DB Ausdrücke.

+0

Manuelle SQL-Abfrage ist immer verfügbar, aber ich dachte vorher, dass ORM das Problem sofort lösen kann. Ich habe nicht viele Erfahrungen mit dem Abfrage-Generator, ich schaue hinein. Danke für die alternative Antwort. – leonardys

+0

Wie Sie sehen können, verwendet mein Code $ this -> _ has_many ['roles'] -Einstellungen. Wenn Sie also das zugehörige Modell oder den Fremdschlüssel ändern, funktioniert diese Methode ohne jede Änderung (anstelle von einfachen SQL-Abfragen). – biakaveron

+0

Funktioniert '' -> wo ($ this -> _primary_key, 'IN', $ ids) 'nicht? –