[英]Why does CakePHP use this method name in a MySQL query rather than return the result?
在应用上一个问题的答案时,我尝试覆盖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的继承运算符。 我的函数似乎正在返回被覆盖的函数的名称,而不是其值。
我怎样才能解决这个问题?
当CakePHP在模型或附加行为中找不到方法时,通常会发生这种情况。
然后,它将调用传递给数据源(希望它具有方法并知道该怎么做),这就是为什么会出现此错误的原因。
我会检查事物的外观(是正确模型中的方法,是因为文件命名不正确,Cake制作了自动模型等)
我已修复此问题,但并未真正解决我提出的问题。
而不是像上面的示例那样将调整后的参数向上传递,而是使用它们直接完成相同的工作:
return $this->find('count', compact($conditions, $recursive, $extra));
这可以正常工作,但不能解释导致我首先提出问题的奇怪行为。 我的猜测是Cake通过虚拟/“自动”方法正在做一些时髦的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.