CakePHP:如何根据二级关联条件查询结果?

时间:2011-11-29 13:22:59

标签: php cakephp

假设我们有3个模型,User,House和Profile,它们之间有以下关联:

  • 用户拥有许多房屋(房屋属于用户)
  • 用户hasOne个人资料(个人资料属于用户)

我想查询house(在HousesController类中),其关联的Profiles满足给定的Profile条件。请考虑以下示例:

假设性别是Profile模型的属性,我想检索其所有者为男性的所有房屋。

我发现了this问题,这个问题与我所寻求的相近。在我的情况下,模型之间的关系更复杂(House belongsTo User hasOne Profile),我无法让它工作。我尝试过这样的事,没有任何运气:

$this->House->find('all', array(
                  'contain' => array(
                      'User' => array(
                          'Profile' => array(
                              'conditions' => array(
                                  'Profile.gender' => 'male'
))))));

以上呼叫将返回所有房屋,如果性别为男性,则会在结果中包含相应的用户个人资料。否则,用户的配置文件仍为空。我究竟需要的是返回所有者为男性的房屋。

我实际上是使用Model::find()函数的'join'选项实现的,但我想知道这是否可能没有使用'join',如果是,怎么样?

1 个答案:

答案 0 :(得分:2)

我建议使用 bindModel 方法明确声明关系。

您可以从 Houses 控制器执行此操作,如下所示:

/**
 * Bind the models together using explicit conditions
 */
$this->House->bindModel(array(
  'belongsTo' => array(
    'User' => array(
      'foreignKey' => false,
      'conditions' => array('House.user_id = User.id')
    ),
    'Profile' => array(
      'foreignKey' => false,
      'conditions' => array('Profile.user_id = User.id')
    )
  )
));

/**
 * Standard find, specifying 'Profile.gender' => 'male'
 */
$houses = $this->House->find('all', array(
  'conditions' => array(
    'Profile.gender' => 'male'
  )
));