2011-08-19 98 views
4

我有一個相當修改的分頁查詢使用一些聯接等 - 但出於某種原因paginator->計數器()從不匹配計數查詢的結果。CakePHP分頁計數不匹配查詢?

您可以在http://dev.qreer.com/的行動中看到它 - 通過選擇LHS導航上的各種選項,查詢輸出如下,並且分頁計數看起來非常隨機。

任何想法,我可以開始尋找調試呢?

在作業控制器:

$this->paginate = $this->Job->paginateParams($data); 
    $jobs = $this->paginate('Job'); 
    $this->set(compact('jobs')); 

在Model:

function paginateParams($data = null){ 
     //lots of joins + conditions 
     return array('contain' => $contain, 'recursive' => 0,'joins' => $joins, 'conditions' => $conditions, 'group' => 'Job.id', 'order' => $order); 
    } 

樣品加入(有內連接所有連接表和數據表):

 array(
      'table' => 'education_backgrounds', 
      'alias' => 'EducationBackground', 
      'type' => 'INNER', 
      'conditions' => array('EducationBackgroundsJobs.education_background_id = EducationBackground.id'), 
     ), 

樣品條件:

 'EducationBackground.name' => array('Aerospace Engineering'); 
+2

昨天我遇到了同樣的問題,它發生在分頁查詢中有一個組時。沒有找到修復... – Dunhamzzz

回答

8

這是因爲group by我找到了解決方法。我很想把鏈接,但我已經失去了它,所以我會張貼代碼:

public function paginateCount($conditions = null, $recursive = 0, $extra = array()) { 
    $parameters = compact('conditions', 'recursive'); 
    if (isset($extra['group'])) { 
     $parameters['fields'] = $extra['group']; 
     if (is_string($parameters['fields'])) { 
      // pagination with single GROUP BY field 
      if (substr($parameters['fields'], 0, 9) != 'DISTINCT ') { 
       $parameters['fields'] = 'DISTINCT ' . $parameters['fields']; 
      } 
      unset($extra['group']); 
      $count = $this->find('count', array_merge($parameters, $extra)); 
     } else { 
      // resort to inefficient method for multiple GROUP BY fields 
      $count = $this->find('count', array_merge($parameters, $extra)); 
      $count = $this->getAffectedRows(); 
     } 
    } else { 
     // regular pagination 
     $count = $this->find('count', array_merge($parameters, $extra)); 
    } 
    return $count; 
} 

我補充它在app_model,它對於我來說:)

希望這個作品罰款幫助

編輯:我發現鏈接=)

http://wiltonsoftware.com/posts/view/custom-group-by-pagination-and-a-calculated-field

+0

謝謝!這幾乎完全是我制定的 - 但這絕對是'全面解決'的解決方案。 –

+0

真棒解決方案,完美工作! – Benjam

+0

非常感謝很多:D – waseem

1

想通了:

paginator計數器依靠$this->find('count')返回結果總數的整數,由於某些原因,它不喜歡'group'參數。因此,按照Custom Query Pagination(也建議在頁面的底部做自己算的任何自定義/修改分頁) - 添加以下到我的模型:

function paginateCount(){ 
    $params = Configure::read('paginate.params'); 
    $params['fields'] = 'DISTINCT (Job.id)'; 
    unset($params['group']); 
    unset($params['contain']); 
    unset($params['order']); 
    return $this->find('count', $params); 
} 

這將覆蓋值與正確的而且這一切似乎都很完美。

記住我已經將Configure::write('paginate', array('params' => $this->paginate['Job']));添加到我的控制器,因此我可以訪問分頁參數。

0

功能paginateCount($條件= NULL,$遞歸= 0,$額外) {

    $db = $this->getDataSource(); 
          $sql = $db->buildStatement(
            array(
            'fields'  => array('DISTINCT Gdi.id'), 
            'table'  => $db->fullTableName($this), 
            'alias'  => 'Gdi', 
            'limit'  => null, 
            'offset'  => null, 
            'joins'  => isset($extra['joins'])?$extra['joins']:null, 
            'conditions' => $conditions, 
            'order'  => null, 
            'group'  =>isset($extra['group'])?$extra['group']:null 
            ), 
          $this 
          ); 



        $this->recursive = $recursive; 
        $results = $this->query($sql); 

        return count($results); 
      } 

只是在你的模型中添加此功能,並更改字段名稱和型號名稱。使用此功能,您可以自定義您自己的查詢計數。