我正在學習框架,現在正在使用它構建一個應用程序。Kohana 3驗證模塊,以'staff'或'manager'角色獲取用戶
我需要讓所有具有「用戶」或「員工」角色的用戶,但我無法在文檔中找到它。
幫助任何人? (我認爲這是更多的一個ORM問題的驗證模塊)
我正在學習框架,現在正在使用它構建一個應用程序。Kohana 3驗證模塊,以'staff'或'manager'角色獲取用戶
我需要讓所有具有「用戶」或「員工」角色的用戶,但我無法在文檔中找到它。
幫助任何人? (我認爲這是更多的一個ORM問題的驗證模塊)
我沒有找到一個簡單的方法來使用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);
可能你應該爲它創建一個單獨的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',所以我使用數據庫表達式。
手動sql查詢總是可用的,但我認爲之前,ORM可以解決這個問題。我沒有太多關於查詢生成器的經驗,我正在研究它。感謝您的替代答案。 – leonardys 2010-08-28 09:05:23
正如你所看到的,我的代碼使用$ this - > _ has_many ['roles']設置,所以如果你改變相關模型或者foreign_key,這個方法將不用修改(而不是普通的SQL查詢)。 – biakaveron 2010-08-30 06:08:57
是否存在($ this - > _ primary_key,'IN',$ ids)'不工作? – 2010-09-27 10:50:52
這是它如何爲我工作,如果你們中有任何人有更好的選擇可以自由發佈在這裏。 – leonardys 2010-08-26 06:07:26
我相信這是它應該完成的方式。另請注意,您可以使用數組幫助器來代替'array_merge()':$ results = Arr :: merge($ staffs,$ managers);'。親切的問候。 – 2011-12-28 19:30:34