CakePHP递归不适用于条件

时间:2014-07-23 16:51:07

标签: php sql cakephp cakephp-2.3

我在从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',
        )
    );

}

当我删除条件时,我会返回包含详细信息的数组。但是条件我得到以下错误:

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

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

这是CakePHP中的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

不,这不是CakePHP的错误。它只是设计的方式,在相关模型的查找过程中使用条件通常会创建无效的查询。您应该使用可包含的行为或手动连接以在关联模型上使用条件。

另外,我怀疑你无论如何都不会得到你想要的结果。 CakePHP默认使用左连接。因此,您的结果不会受与所需详细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))),
    ));