2010-06-02 7 views
0

Je suis en train d'ajouter les SQL_CALC_FOUND_ROWS dans une requête (S'il vous plaît noter que ce n'est pas pour la pagination)CakePHP et SQL_CALC_FOUND_ROWS

s'il vous plaît noter que je suis en train d'ajouter à un CakePHP interroger le code que j'ai actuellement est ci-dessous:

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'))) 
      )); 

Notez le 'fields'=>array('SQL_CALC_FOUND_ROWS',' évidemment cela ne fonctionne pas comme il tente d'appliquer la SQL_CALC_FOUND_ROWS à la table par exemple SELECT Catégorie . SQL_CALC_FOUND_ROWS ,

Y a-t-il un moyen de le faire? Toute aide serait grandement appréciée, merci.

+0

Je sais exactement comment ça se passe sans gâteau, je suis forcé avec un cadre pour ce projet, et le manuel n'est pas très utile cette fois-ci ... Toujours le manuel d'abord pour moi! – Lizard

Répondre

0

Vous pouvez regarder cakephp paginate using mysql SQL_CALC_FOUND_ROWS. La personne avait une syntaxe similaire à celle que vous avez et cela a fonctionné pour lui. Si cela ne vous aide pas, vous pouvez toujours utiliser $this->find('count', $params); (http://book.cakephp.org/view/1020/find-count) ou $this->query('YOUR SQL QUERY HERE'); (http://book.cakephp.org/view/1027/query). En outre, vous ne devez pas utiliser 'joins' avec 'contain'. Selon le documentation que "pourrait conduire à des erreurs SQL (tables dupliquées), vous devez donc utiliser la méthode des jointures comme alternative pour Containable".

0

Peut-être que vous pouvez faire votre paramètre de champ comme ci-dessous:

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

je trouve un moyen de le réaliser avec un gâteau construit dans les fonctions.

$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()']); 
+1

Malheureusement cela ne fonctionnerait pas car nous utilisons le comportement containable et il y a plusieurs requêtes effectuées lors de l'appel des fonctions query()/find() – Lizard

0

C'est horrible, horribles hack pour une SQL_CALC_FOUND_ROWS dans la requête non échappés, mais il fonctionne:

$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`'); 

Tout le crédit va à "Kani" de http://mogura.in/blog/2011/06/17/cakephp-1-3-sql_calc_found_rows.