我在 CakePHP 应用程序中有一个模型 User
和一个模型 Role
。两个模型之间的关联如下:
User $belongsTo Role
Role $hasMany User
我想对 User
模型进行查询,以查找具有特定角色(比如说角色 Supervisor)的所有用户。我是这样查询的:
$supervisors = $this->User->find('all', array(
'contain' => array(
'Role' => array(
'conditions' => array(
'Role.name' => '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 个查询来做到这一点。为什么第一种方法不起作用。有什么想法吗?
谢谢
最佳答案
您的尝试失败的原因
CakePHP 的 Containble
行为为每个模型创建单独的查询。所以 - 你所做的基本上是这样描述的:“查找所有用户。还可以找到名称为“主管”的任何角色。如您所见,两者之间没有交叉的条件。
因此,您可以执行以下操作之一:
1) [简单方法] 反过来查询
从 Role
模型中查询并包含它的用户。这将拉出您想要的角色(根据您提供的条件),然后包含它的任何/所有用户。
注意 - 如果您已经加载了“用户”模型(或者因为您在 UsersController
中而默认加载了它),您可以像这样运行您的查找: $this->User->Role->find(.....
- 这样您就不必单独加载 Role
模型。
2) 使用 JOIN(参见 CakePHP Book on Joining Tables)
这允许您根据关联数据限制父模型的结果。
关于php - cakephp 在关联模型上查找查询条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748865/