我有这个自定义查找方法,也与分页一起使用。但它生成的查询是错误的。出于某种原因,它无缘无故地将字段放入SELECT中。我甚至不在find方法的count部分指定它们:
$query['fields'] = array('COUNT(*)');
错误I' gettign就是这样:
错误:SQLSTATE [23000]:完整性约束违规:1052列 ' ID'在字段列表中是不明确的
但Cake没有明显的原因产生这个查询:
SELECT COUNT(*),Country.id,State.id,ClientStatus.id, SalesStatus.id,id FROM ...
我到目前为止发现的是,当我从contains数组中删除CompanyType
时查询有效。 CompanyType
是HABTM协会,我不会将条件应用于我只想返回数据的那个。 Cake应该生成一个单独的查询。但是,我不明白没有任何前缀的id
如何进入查询。 :(
当我调试$query
变量时,我只看到计数集,没有其他字段。为什么Cake会在这里添加其他字段,尤其是孤独的id
?我该如何解决这个问题?
查找方法:
public function _findSearch($state, $query, $results = array()) {
$this->Behaviors->unload('Tags.Taggable');
$this->unbindModel(array(
'hasAndBelongsToMany' => array(
'Tag',
//'CompanyType'
)
), false);
if ($state === 'before') {
$query['contain'] = array(
'Country',
'State',
'SalesStatus',
'ClientStatus',
'CompanyType',
);
$query['fields'] = array(
$this->alias . '.id',
$this->alias . '.company',
$this->alias . '.company2',
$this->alias . '.company3',
$this->alias . '.street',
$this->alias . '.postal_code',
$this->alias . '.city',
$this->alias . '.selection_ranking',
$this->alias . '.role',
'Country.id',
'Country.country',
'State.id',
'State.name',
'ClientStatus.id',
'ClientStatus.name',
'SalesStatus.id',
'SalesStatus.name'
);
if (isset($query['operation']) && $query['operation'] === 'count') {
$query['fields'] = array('COUNT(*)');
//debug($query);
}
return $query;
}
if (($state === 'after') && isset($query['operation']) && $query['operation'] === 'count') {
return $results[0][0]['COUNT(*)'];
}
return $results;
}
答案 0 :(得分:2)
尝试使用autoFields = false卸载并重新加载可包含的行为。
$this->Behaviors->unload('Containable');
$this->Behaviors->load('Containable', array(
'autoFields' => false
));
除了COUNT(*)之外的所有字段都没有声明也没有,但是可以包含它们。到目前为止没有问题。问题是它增加了" id"没有前缀然后导致SQL错误。
来自它的文档:
autoFields :(布尔值,可选)自动添加所需的字段以获取请求的绑定。默认值:真实
解决方法是使用autoFields false重新加载行为。这似乎是一个核心错误...... :(