2013-01-04 102 views
4

嘗試使用CakePHP分頁程序對數據進行排序時,它將返回區分大小寫的排序結果。我試圖在訂單查詢中指定的字段周圍添加UPPER,但這似乎不起作用。我將CakePHP 2.0.3與PostgreSQL數據庫結合使用。我的$ PAGINATE變量和代碼來調用它是:CakePHP分頁程序區分大小寫

var $paginate = array(
    'limit' => 25, 
    'order' => array(
     'User.first_name' => 'asc' 
    ) 
); 
.. 

(In my view function) 
    $users = $this->paginate('User'); 

我怎麼能強迫的CakePHP返回一個不區分大小寫的排序結果?

+0

爲什麼數據大小寫敏感呢? shouldnt'utf8_unicode_ci'(CI代表不區分大小寫)從源頭解決問題,而不是嘗試修復症狀? – mark

回答

3

這是你不能使用這樣一個恥辱:

'UPPER(User.first_name)' => 'ASC' 

這將是非常基本的。

我在一個項目有這個問題,因此我取代了「秩序」陣列是這樣的:

'order' = "UPPER(first_name) ASC" 

成功地給了我正確的輸出。

不幸的是,單擊列標題字段對我的分頁表進行排序然後複製問題,從而我的名字再次區分大小寫。

我想出的解決方案是修改cakephp本身的PaginatorComponent,這樣我的排序順序總是正確的。

在PaginatorComponent(/lib/Cake/Controller/Component/PaginatorComponent.php)我修改了validateSort功能,更換下列行:

$options['order'] = $order; 

與下面的四行:

foreach($order as $order_field=>$order_direction){ 
    $neworder['UPPER('.$order_field.')'] = $order_direction; 
} 
$options['order'] = $neworder; 

它並不高雅,基本上只是強迫字段名稱的'UPPER()'。

這工作在我特殊的情況下,我需要總是有不區分大小寫的查詢。

+1

當我可以幫助時,我不喜歡弄髒蛋糕核心,但這是一個非常簡單的解決方案,不應該對其他領域有任何影響,因爲它只用於分頁,無論如何應該不區分大小寫。似乎正在處理這一變化,謝謝! –

+0

值得注意的是,這隻適用於UPPER()函數實際工作的字母數字字段。 我遇到了一個問題,這是我試圖按日期時間字段排序,並失敗[錯誤:功能上(無時區的時間戳)]不存在]。 作爲一種解決方法,再一次,對於我的特定應用程序來說,我用上面的'四行'包裝了 if($ options ['sort']!=「User.created」){//四行}這允許我的用戶通過創建的columnm進行排序,而不需要代碼死亡 - 對於其他任何字段,如果需要將它們放在上面。 –