2014-05-23 43 views
1

我在嘗試獲取分頁結果列表,但我想要在計算字段上對它們進行排序的選項。使用CakePHP分頁對計算字段進行排序

我有這樣的:

$this->Paginator->settings = array(
     'fields' => 'COUNT(Invoice.id) as totalInvoices, 
       SUM(Invoice.price_paid) as totalPaid, 
       MAX(Invoice.invoice_date) as latestInvoice', 
     'group' => array('Invoice.supplier_id'), 
     'order' => array($order => $direction) 
    ); 

$順序是該領域的排序上的名字,和$方向僅僅是「ASC」或「降序」。

這很好,如果我排序在數據庫中存在的字段,如'price_paid'按順序查找Invoices或每件東西的數量,但似乎無法應對totalPaid上的排序或latestInvoice - 我只是得到未排序的結果。

我試着創建一個虛擬的領域,例如,

$this->Invoice->virtualFields['latestInvoice'] = 'MAX(Invoice.invoice_date)'; 
$order = "Invoice.latestInvoice"; 

但這也似乎沒有任何區別 - 排序順序仍然被忽略。

我在網上尋找解決方案,但他們似乎都通過使用虛擬領域來解決問題,這顯然不適合我!

任何人都可以幫忙嗎?謝謝!

回答

5

我的虛擬域嘗試過了,這是工作正常,我下面是我的代碼可以幫助它: -

$this->Invoice->virtualFields['latestInvoice'] = 'MAX(Invoice.invoice_date)'; 
$order = "Invoice.latestInvoice"; 
$options = array(    
       'fields' => 'COUNT(Invoice.id) as totalInvoices, 
         SUM(Invoice.price_paid) as totalPaid, 
         MAX(Invoice.invoice_date) as latestInvoice', 
       'order' => array($order =>'asc'), 
      ); 
$this->paginate = $options; 
$list = $this->paginate('Invoice'); 
pr($list);die; 

陣還要檢查虛擬領域是$名單與否。

+0

謝謝。事實證明,我錯誤地傳遞了命名參數(我已經命名它們,例如sort:latestInvoice),並且它們覆蓋了我在上面的代碼中設置的順序。我一直在使用switch語句來獲取排序值的名稱,然後嘗試通過order變量來更改它,但代碼並未接受 - 因此它試圖排序(就其知道的情況而言) )不存在的字段'latestInvoice',並救助。謝謝你的幫助! – Sharon

相關問題