При применении ответа от предыдущего вопроса я попытался переопределить один из встроенных методов разбиения на страницы 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, для правильного синтаксиса для использования рядом с 'paginateCount' в строке 1
Поскольку у меня включена отладка, я могу видеть, где обычно будет запрос paginateCount ():
1: SELECT COUNT(*) AS `count` FROM `tournaments` AS `Tournament` WHERE 1 = 1
Я просто получаю:
1: paginateCount
Я, очевидно, неправильно понял PHP-наследования операторов. Кажется, моя функция возвращает имя функции, которая она переопределяет, а не ее значение.
Как я могу это исправить?
Обычно это происходит, когда CakePHP не может найти метод в модели или приложенном поведении.
Затем он передает вызов источнику данных (надеясь, что он имеет метод и знает, что делать), и именно поэтому вы получаете эту ошибку.
Я бы проверял, что это то, что они кажутся (это метод в правильной модели, это торт, делающий автомодель из-за неправильного filenaming и т. Д.),
Я исправил это, не обращаясь к вопросу, который я задал.
Вместо того, чтобы передавать скорректированные параметры вверх по цепочке, как я хотел сделать в моем примере выше, я использовал их для выполнения той же самой работы напрямую:
return $this->find('count', compact($conditions, $recursive, $extra));
Это работает нормально, но не объясняет странное поведение, которое заставило меня задать вопрос в первую очередь. Я предполагаю, что Cake делает что-то напуганное с помощью виртуальных / «автоматических» методов.