【问题标题】:cakephp find query conditions on associated modelcakephp 在关联模型上查找查询条件
【发布时间】:2013-11-03 01:22:12
【问题描述】:

我在 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 个查询来做到这一点。为什么第一种方法不起作用。请问有什么办法吗?

谢谢

【问题讨论】:

    标签: php cakephp cakephp-1.3 php-5.3


    【解决方案1】:

    您的尝试失败的原因

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

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

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

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

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

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

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

    【讨论】:

    • "User $belongsTo Role" 所以在这种情况下,查询用户并离开加入角色实际上是正确的。如果配置正确,则不应在此处创建单独的查询。
    • @mark - 我提到他可以使用联接(#2)。或者,他可以只反转查询并使用 Containable。很多选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多