为什么CakePHP在MySQL查询中使用此方法名称而不是返回结果?

时间:2011-09-28 12:38:36

标签: php oop cakephp inheritance

在应用a previous question的答案时,我尝试重写CakePHP的内置分页方法之一:

function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    if (isset($extra['group'])) {
        for ($i=0; $i<count($extra['group']);$i++) {
            if (strpos(strtolower($extra['group'][$i]),'having')!==false) unset($extra['group'][$i]);
        }
        exit();
    }
    $count = parent::paginateCount($conditions, $recursive, $extra);
    return $count;
}

问题是,这似乎导致Cake执行一个只包含方法名称的MySQL查询。显然这不起作用并抛出错误:

  

SQL错误:1064:您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'paginateCount'附近使用正确的语法

由于我启用了调试功能,我可以看到通常存在paginateCount()查询的位置:

1: SELECT COUNT(*) AS `count` FROM `tournaments` AS `Tournament` WHERE 1 = 1 

我得到:

1: paginateCount

我显然误解了PHP的继承运算符。我的函数似乎是返回它覆盖的函数的名称而不是它的值。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

当CakePHP无法在模型或附加行为中找到方法时,通常会发生这种情况。

然后将调用传递给数据源(希望它有方法并知道该怎么做),这就是你得到这个错误的原因。

我会检查它们看起来是什么(是正确模型中的方法,Cake是因为文件不正确而制作自动模型等)。

答案 1 :(得分:0)

我已经解决了这个问题而没有真正解决我提出的问题。

不是像我在上面的例子中那样将调整好的参数传递到链上,而是用它们直接做同样的工作:

return $this->find('count', compact($conditions, $recursive, $extra));

这样做没问题,但并没有解释导致我首先提出问题的奇怪行为。我的猜测是,Cake正在用虚拟/“自动”方法做一些时髦的事情。