在应用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的继承运算符。我的函数似乎是返回它覆盖的函数的名称而不是它的值。
我该如何解决这个问题?
答案 0 :(得分:1)
当CakePHP无法在模型或附加行为中找到方法时,通常会发生这种情况。
然后将调用传递给数据源(希望它有方法并知道该怎么做),这就是你得到这个错误的原因。
我会检查它们看起来是什么(是正确模型中的方法,Cake是因为文件不正确而制作自动模型等)。
答案 1 :(得分:0)
我已经解决了这个问题而没有真正解决我提出的问题。
不是像我在上面的例子中那样将调整好的参数传递到链上,而是用它们直接做同样的工作:
return $this->find('count', compact($conditions, $recursive, $extra));
这样做没问题,但并没有解释导致我首先提出问题的奇怪行为。我的猜测是,Cake正在用虚拟/“自动”方法做一些时髦的事情。