跨多个模型构建条件语句(CakePHP 1.2.5)

时间:2009-10-27 18:45:10

标签: php sql cakephp join left-join

假设我有3个模型:用户,地区,国家。

User belongsTo Region
Region belongsTo Country

这些模型中的每一个都使用Containable行为。我正在尝试使用代码“US”查找来自该国家/地区的用户。这是我正在尝试的:

$users = $this->User->find('all', array(
    'conditions' => array('Country.code' => 'US'),
    'contain'    => array('Region.Country'),
));

CakePHP将此分为2个查询:

  1. 首先,选择代码为“US”的所有国家/地区的ID。
  2. 然后使用这些ID来选择所有用户加入region.country_id所在国家/地区ID列表中的区域。
  3. 因此,我最终在我的应用程序中出现SQL错误,因为我的conditions数组包含对Country.code的引用,而Cake构建的第二个查询不会加入国家。

    我看到的最好的Cake解决方案是构建一个子查询,如手册的Complex Find Conditions部分所述。然而,这看起来非常复杂,而且比我想实现的更糟糕。我有一种更容易忽视的方式吗?

2 个答案:

答案 0 :(得分:2)

Nate Abele(CakePHP的前任负责人)写了一篇关于做ad hoc joins的文章可能有所帮助。

答案 1 :(得分:1)

将条件也包含在包含中。 E.g:

$users = $this->User->find('all', array('contain' => array(
    'Region' => array(
        'Country' => array(
            'conditions' => array('Country.code' => 'US'),
        ),
    ),
)));

请参阅the Containable manual

中的倒数第二个示例