CakePHP 查找关联模型上的查询条件


cakephp find query conditions on associated model

我有一个模型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'
            )
        )
    )
));

但是上面的查询向我返回了我的用户表中的所有用户。它不会仅返回具有角色主管的用户。我知道,如果我执行两个查询,一个在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 个查询来做到这一点。为什么第一种方法不起作用。请问有什么想法吗?

谢谢

您的尝试失败的原因

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

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

1)[简单方法]反过来查询

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

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

2) 使用 JOIN(参见 CakePHP 关于连接表的书)

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