2010-06-02 3 views
0

(이 유의하시기 바랍니다이 페이지 매기기에없는)CakePHP의 내가 쿼리에 SQL_CALC_FOUND_ROWS를 추가하려고 SQL_CALC_FOUND_ROWS

는 내가 현재 가지고있는 코드를 조회 CakePHP의이를 추가하려고 유의하시기 바랍니다는 다음과 같습니다 :

return $this->find('all', array(
       'conditions' => $conditions, 
       'fields'=>array('SQL_CALC_FOUND_ROWS','Category.*','COUNT(`Entity`.`id`) as `entity_count`'), 
       'joins' => array('LEFT JOIN `entities` AS Entity ON `Entity`.`category_id` = `Category`.`id`'), 
       'group' => '`Category`.`id`', 
       'order' => $sort, 
       'limit'=>$params['limit'], 
       'offset'=>$params['start'], 
       'contain' => array('Domain' => array('fields' => array('title'))) 
      )); 

참고 'fields'=>array('SQL_CALC_FOUND_ROWS',' 그것은 테이블 예에 SQL_CALC_FOUND_ROWS을 적용하는 시도로이 분명 작동하지 않습니다 SELECT 범주 . SQL_CALC_FOUND_ROWS ,

어쨌든이 작업이 수행되고 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

나는 그것이 케이크없이하는 방법을 정확히 안다. 나는이 프로젝트를위한 틀과 함께 강제된다. 매뉴얼은 이번에는별로 도움이되지 않는다. – Lizard

답변

0

cakephp paginate using mysql SQL_CALC_FOUND_ROWS을 볼 수 있습니다. 그 사람은 당신과 비슷한 문법을 ​​가졌고 그 사람을 위해 일했습니다.

도움이되지 않는 경우 항상 $this->find('count', $params); (http://book.cakephp.org/view/1020/find-count) 또는 $this->query('YOUR SQL QUERY HERE'); (http://book.cakephp.org/view/1027/query)을 사용할 수 있습니다.

게다가 'contain'과 함께 'joins'을 사용하지 않아야합니다. documentation에 따르면 "은 일부 SQL 오류 (중복 테이블)로 이어질 수 있으므로 Containable"의 대안으로 조인 방법을 사용해야합니다.

'fields'=>array('SQL_CALC_FOUND_ROWS *','COUNT(`Entity`.`id`) as `entity_count`') 
0

아마 당신은 아래에 필드 매개 변수를 만들 수 있습니다.

$dbo = $this->User->getDataSource(); 

//buildStatement() creates a Standard SQL Statement 
$subQuery = $dbo->buildStatement(
    array(
     'fields' => $fields, 
     'table' => $dbo->fullTableName($this->User), 
     'alias' => 'User', 
     'limit' => null, 
     'offset' => null, 
     'joins' => array(), 
     'conditions' => $conditions, 
     'order' => null, 
     'group' => null 
    ), 
    $this->User 
); 

//Add the SQL_CALC_FOUND_ROWS part 
$subQuery = str_replace('SELECT', 'SELECT SQL_CALC_FOUND_ROWS', $subQuery); 
$Users = $this->User->query($subQuery); 

//Get FOUND ROWS 
$foundRows = $this->User->query("SELECT FOUND_ROWS()"); 
$count = intval($foundRows[0][0]['FOUND_ROWS()']); 
0

내가 기능을 내장 케이크와 그것을 실현하는 방법을 발견 :

+1

불행히도 이것은 우리가 containable behavoir를 사용하고 query()/find() 함수를 호출 할 때 여러 개의 쿼리가 수행되기 때문에 작동하지 않을 것입니다 – Lizard

0

이 쿼리에 이스케이프 SQL_CALC_FOUND_ROWS을 얻을 수있는 무서운, 끔찍한 해킹이지만, 그것은 작동합니다

$categories = $this->Category->find('all', array(
    'fields' => array('SQL_CALC_FOUND_ROWS 0.0 AS dummy_field,1', 'Category.*', ...), 
    'limit' => 42, 
    ... 
)); 
$totalCategories = $this->Category->query('SELECT FOUND_ROWS() as `total_categories`'); 

모든 신용 http://mogura.in/blog/2011/06/17/cakephp-1-3-sql_calc_found_rows에서에 "카니을"간다.

관련 문제