php - cakephp 在关联模型上查找查询条件

标签 php cakephp cakephp-1.3 php-5.3

我在 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/

相关文章:

php - 无法使用 Ec2 和 RDS 选择数据库 Foo

php - 如何处理来自文本区域的大量 POST 数据?

php - CakePHP HABTM 条件

php - 更改 CakePHP 中自定义日志的路径

cakephp - 在 cakephp 中使用 DATE_SUB(CURDATE(),INTERVAL 2 DAY) 条件的方法

php - 安装 ssl 证书后重定向错误太多

CakePHP GROUP 和 COUNT 个项目在列表中返回

php - 如何从表中获取行数并将其插入到 MySQL 中的同一个表中?

javascript - 如何使用 JavaScript 将数据插入 Yii 框架 2.0 CKEditor 扩展?

php - CakePHP Auth 允许 JSON 扩展