2010-08-24 72 views

回答

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 2010-08-26 06:07:26

+0

我相信這是它應該完成的方式。另請注意,您可以使用數組幫助器來代替'array_merge()':$ results = Arr :: merge($ staffs,$ managers);'。親切的問候。 – 2011-12-28 19:30:34

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

$ roles是一個role_id數組(不是名稱!)。 PS。我不記得如何查詢'WHERE IN',所以我使用數據庫表達式。

+0

手動sql查詢總是可用的,但我認爲之前,ORM可以解決這個問題。我沒有太多關於查詢生成器的經驗,我正在研究它。感謝您的替代答案。 – leonardys 2010-08-28 09:05:23

+0

正如你所看到的,我的代碼使用$ this - > _ has_many ['roles']設置,所以如果你改變相關模型或者foreign_key,這個方法將不用修改(而不是普通的SQL查詢)。 – biakaveron 2010-08-30 06:08:57

+0

是否存在($ this - > _ primary_key,'IN',$ ids)'不工作? – 2010-09-27 10:50:52