我在从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中的错误还是我做错了什么?
答案 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))),
));