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

时间:2013-11-03 01:22:12

标签: php cakephp cakephp-1.3 php-5.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'
            )
        )
    )
));

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

谢谢

1 个答案:

答案 0 :(得分:6)

您尝试无效的原因

CakePHP的Containble行为为每个模型创建单独的查询。所以 - 你所做的基本上是这样描述:“查找所有用户。同时找到任何名为'Supervisor'的角色。如您所见,两者之间没有任何条件。

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

1)[简单方法]以相反的方式查询

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

注意 - 如果您已经加载了“用户”模型(或者由于您位于UsersController中而默认已加载),您可以按以下方式运行查找:$this->User->Role->find(..... - 因此您无需单独加载Role模型。

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

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