2013-11-03 49 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