3

我在 CakePHP 应用程序中有一个模型User和一个模型Role。两种模型之间的关联如下:

User $belongsTo Role
Role $hasMany User

我想对User模型进行查询以查找具有特定角色的所有用户(比如说角色主管)。我做了这样的查询:

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

但是上面的查询返回了我的用户表中的所有用户。它不只返回角色为 Supervisor 的用户。我知道如果我做两个查询,一个在Role模型上查找角色类型“主管”的 id,然后在用户模型上进行另一个查询,并在我的用户模型的条件中传递主管角色记录的 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 个查询来做到这一点。为什么第一种方法不起作用。请问有什么想法吗?

谢谢

4

1 回答 1

6

您的尝试失败的原因

CakePHP 的ContainbleBehavior 为每个模型创建单独的查询。所以 - 你所做的基本上是这样描述的:“查找所有用户。还找到任何名为“主管”的角色。如您所见,两者之间没有交叉条件。

因此,您可以执行以下操作之一:

1)【简单方式】反之查询

Role模型中查询并包含它的用户。这会提取您想要的角色(根据您提供的条件),然后包含任何/所有用户。

注意 - 如果您已经加载了“用户”模型(或者默认情况下已加载,因为您在 中UsersController),您可以像这样运行您的查找: $this->User->Role->find(..... -因此您不必Role单独加载模型。

2) 使用 JOIN(参见CakePHP Book on Joining Tables

这允许您根据父模型的关联数据来限制父模型的结果。

于 2013-11-03T03:28:32.860 回答