[英]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.