在对自定义查找进行分页时,CakePHP会为计数生成错误的查询

时间:2014-10-15 16:12:39

标签: cakephp has-and-belongs-to-many cakephp-2.4

我有这个自定义查找方法,也与分页一起使用。但它生成的查询是错误的。出于某种原因,它无缘无故地将字段放入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;
}

1 个答案:

答案 0 :(得分:2)

尝试使用autoFields = false卸载并重新加载可包含的行为。

$this->Behaviors->unload('Containable');
$this->Behaviors->load('Containable', array(
    'autoFields' => false
));

除了COUNT(*)之外的所有字段都没有声明也没有,但是可以包含它们。到目前为止没有问题。问题是它增加了" id"没有前缀然后导致SQL错误。

来自它的文档:

  

autoFields :(布尔值,可选)自动添加所需的字段以获取请求的绑定。默认值:真实

解决方法是使用autoFields false重新加载行为。这似乎是一个核心错误...... :(