2013-06-20 21 views
1

您好我已經做了find()方法,並添加一個新的領域的一些結果:CakePHP的傳遞一個數組進行分頁() - 新模式

$approved = $this->ExpenseClaim->find('all', array('conditions'=> array('ExpenseClaim.claim_status_id' => '3'))); 
$i = 0; 
foreach ($approved as $ap) { 
    $approved[$i]['ExpenseClaim']['claimTotal'] = $this->ExpenseClaim->expenseClaimTotal($approved[$i]['ExpenseClaim']['id']); 
    $i++; 
} 

我現在需要通過這個進行分頁,但是我讀here,你不能這樣做,我必須創建另一個模型,只在這個特定的查找中使用afterFind()方法。

所以我創建了一個名爲ExpenseClaimTotal的新模式和新車型的UseTable設置爲

public $useTable = 'expense_claims'; 

然後一個afterFind()方法,我做了一個簡單的調試:

public function afterFind($results, $primary = false) { 
    debug($results); 
    //return $results; 
} 

但是,當我現在嘗試在pagesController中對這個新模型進行查找失敗:

$this->loadModel('ExpenseClaimTotal'); 

$approved = $this->ExpenseClaimTotal->find('all', array('conditions'=> array('ExpenseClaim.claim_status_id' => '3'))); 

這是錯誤我得到:

Database Error 
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ExpenseClaim.claim_status_id' in 'where clause' 

SQL Query: SELECT `ExpenseClaimTotal`.`id`, `ExpenseClaimTotal`.`user_id`, `ExpenseClaimTotal`.`claim_status_id`, `ExpenseClaimTotal`.`created`, `ExpenseClaimTotal`.`modified`, `ExpenseClaimTotal`.`approved`, `ExpenseClaimTotal`.`approved_by`, `ExpenseClaimTotal`.`declined_by`, `ExpenseClaimTotal`.`date_submitted` FROM `expenses`.`expense_claims` AS `ExpenseClaimTotal` WHERE `ExpenseClaim`.`claim_status_id` = 3 

有似乎沒有在該文檔太多關於使用2種型號爲一個表

+1

添加代碼和進度問題,謝謝 –

回答

2

你不想分頁數組

你」已經執行了查找,執行查找和對得到的數組進行分頁是不明智的。

直接對您的模型數據進行分頁並在流程中注入總值。這樣 - 如果你把你原來的「添加一個新的領域的一些結果」邏輯模型:

class ExpenseClaim extends AppModel { 

    public function afterFind($results, $primary = false) { 

     foreach ($results as &$ap) { 
      if (isset($ap['ExpenseClaim']['id'])) { 
       $ap['ExpenseClaim']['claimTotal'] = $this->expenseClaimTotal($ap['ExpenseClaim']['id']); 
      } 
     } 

     return $results; 
    } 
} 

控制器代碼變得簡單:

pubic function index() { 

    $conditions = array('ExpenseClaim.claim_status_id' => '3'); 
    $data = $this->paginate($conditions); 

    $this->set('data', $data); 
} 

,代碼簡單, 「正常工作」。

增強

以上就是達到理想的效果最簡單的方法,但也有一些缺點 - 即,它會調用在幾乎所有被發現的總方法。

這依賴於你在做什麼,你不妨例如:

緩存您彙總

如果合適的話,你可以通過簡單地將現場「claim_total」到數據庫中刪除的問題,每當它改變時重新計算。這意味着從費用索賠模型中讀取時絕對沒有額外的邏輯。

使用自定義查找類型

如果你不想recaculate上所有被發現的總 - 您可以創建一個custom find type

class ExpenseClaim extends AppModel { 

    public $findMethods = array('allWithTotals' => true); 

    protected function _findAllWithTotals($state, $query, $results = array()) { 
     if ($state === 'before') { 
      return $query; 
     } 

     foreach ($results as &$ap) { 
      $ap['ExpenseClaim']['claimTotal'] = $this->expenseClaimTotal($ap['ExpenseClaim']['id']); 
     } 

     return $results; 
    } 

然後use it in your paginate call

pubic function index() { 
    $this->paginate['findType'] = 'allWithTotals'; # <- 

    $conditions = array('ExpenseClaim.claim_status_id' => '3'); 
    $data = $this->paginate($conditions); 

    $this->set('data', $data); 
} 

這樣,只有索引方法纔會觸發調用來添加總計。

+0

偉大的,再次感謝您的非常深入的答案。我有幾個問題,如果你不介意 - 1.所以我現在不需要一個額外的模型。 2.在自定義查找類型中 - 以前的狀態檢查是什麼? 再次感謝 –

+0

1)否2)查找方法被調用兩次,一次使用查詢參數(條件),一次使用結果 – AD7six

+0

這只是一個變量引用。這意味着'$ ap'的變化反映在'$ results'中,這允許在這些示例中更簡潔的代碼。 – AD7six