CakePHP递归不能处理条件


CakePHP recursive not working with conditions

我在CakePHP中查询模型的相关数据时有一个问题。我写了一个例子来展示这个行为:

TestController.php:

class TestController extends AppController
{
    public $uses = array(
        'User',
        'Upload',
        'Detail'
    );
    public function test(){
        $result = $this->Upload->find('all', array(
                'recursive' => 2,
                'conditions' => array('Detail.id' => 1)
        ));
        print_r($result);
    }
}

Upload.php:

class Upload extends AppModel {
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        )
    );
}

Detail.php:

class Detail extends AppModel {
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        )
    );
}

User.php:

class User extends AppModel {
    public $hasOne = 'Detail';
    public $hasMany = array(
        'Upload' => array(
            'className' => 'Upload',
            'foreignKey' => 'user_id',
        )
    );
}

当我删除条件时,我得到一个包含Details的数组。但是有了这个条件,我得到了以下错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Detail.id' in 'where clause'

查看SQL查询,当我添加条件时,他似乎没有正确地加入表。如果没有这个条件,他将连接所有三个表。

这是一个bug在CakePHP或我做错了什么?

不,这不是CakePHP的bug。它的设计方式很简单,在查找关联模型时使用条件通常会创建无效查询。您应该使用可包含的行为,或者在关联的模型上手动加入使用条件。

而且,我怀疑你无论如何也不会得到你想要的结果。CakePHP默认使用左连接。因此,您的结果将不会受到与所需的Detail ID相关联的结果的限制,相反,它将获得所有上传、与这些上传相关联的所有用户,然后只获得与具有正确ID的用户相关联的那些详细信息。得到你想要的最简单的方法是从相反的方向进行查询:

$result = $this->Detail->find('all', array(
            'recursive' => 2,
            'conditions' => array('Detail.id' => 1)
    ));

编辑:如果你想做左连接,那么让你的查询:

$result = $this->Upload->find('all', array(
            'contain' => array('User' => array('Detail' => array('conditions' => array('Detail.id' => 1))),
    ));