2013-11-03 52 views
3

我在CakePHP應用程序中有一個模型User和一個模型Role。這兩種模式之間的關聯是:cakephp查找關聯模型的查詢條件

User $belongsTo Role 
Role $hasMany User 

我想要在User模型查詢查找所有用戶具有特定角色(假設角色主管)。我做了我這樣的查詢:

$supervisors = $this->User->find('all', array(
    'contain' => array(
     'Role' => array(
      'conditions' => array(
       'Role.name' => 'Supervisor' 
      ) 
     ) 
    ) 
)); 

但上述查詢返回我的用戶表中的所有用戶。它不會僅返回具有角色Supervisor的用戶。我知道如果我執行兩個查詢,一個在Role模型上查找角色類型'Supervisor'的id,然後在User模型上執行另一個查詢,並在我的用戶模型中的條件中傳遞超級用戶角色記錄的ID像這樣:

$supervisor_role_id = $this->Role->field('id', array('Role.name' => 'Supervisor')); 

$supervisors = $this->User->find('all', array(
    'conditions' => array(
     'User.role_id' => $supervisor_role_id 
    ) 
)); 

以上查詢會給我想要的結果。但我不想做2個查詢來做到這一點。爲什麼沒有第一種方法工作。請任何想法嗎?

謝謝

回答

6

的原因,你的嘗試沒有成功

CakePHP的Containble行爲會爲每個模型的單獨查詢。所以 - 你所做的基本上是這樣描述的:「查找所有用戶,並找到任何名爲'Supervisor'的角色。正如你所看到的,兩者之間沒有交叉的條件。

所以,你可以做以下之一:

1)簡單的方法]查詢其他方式從Role模型周圍

查詢和包含它的用戶(一個或多個)。這取決於你想要的角色(根據你提供的條件),然後包含任何/所有的用戶。注意 - 如果你已經加載了'用戶'模型(或者因爲你在UsersController中已經默認加載),你可以像這樣運行你的搜索:$this->User->Role->find(..... - 所以你不必單獨加載Role型號。

2)使用連接(見CakePHP Book on Joining Tables

這樣就可以根據它的相關數據,以限制父模型的結果。

+0

「User $ belongsTo Role」所以在這種情況下,查詢用戶並離開角色實際上是正確的。如果配置正確,它不應該在這裏創建一個單獨的查詢。 – mark

+0

@mark - 我提到他可以使用連接(#2)。或者,他可以顛倒查詢並使用Containable。很多選擇。 – Dave