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