2010-11-28 4 views
1

J'ai Doctrine configuration de requête avec base de données Mysql:Doctrine_Pager retourne mauvais résultats avec plusieurs colonnes de GroupBy

$q = Doctrine_Query::create(); 
    $q->select('make.id, make.make, 
    model.id, model.year, model.model') 
     ->from('Make make') 
     ->innerJoin('make.Models model');  
    $q->groupBy('make.id, model.id'); // <-- this is where the problem 
    $q->orderBy('make ASC'); 
    $q->setHydrationMode(Doctrine_Core::HYDRATE_SCALAR); 
    $pager = new Doctrine_Pager($q, 1, 1); // just want one result to prove the concept 
    $items = $pager->execute(); 

Cette exécute ces trois requêtes (de log MySQL):

SELECT COUNT (*) COMME num_results FROM (SELECT m.) id FROM makem INNER JOIN modelm2 ON m. id = m2. make_id GROUP BY m. id, m2. id) dctrn_count_query

SELECT DISTINCT m3. id DE makem3 INNER JOIN modelm4 ON m3. id = m4. make_id GROUP BY m3. id, m4. id COMMANDER PAR m3. make ASC LIMIT 1

SELECT m. id AS m__id, m. make AS m__make, m2. id AS m2__id, m2. year AS m2__year, m2. model AS m2__model DE makem INNER JOIN modelm2 ON m. id = m2. make_id O WH m. id EN ('33') GROUPE PAR m. id, m2. id COMMANDER PAR m. make ASC

Et le jeu de résultats est

array 
     0 => 
      array 
       'make_id' => string '33' (length=2) 
       'make_make' => string 'Alfa-romeo' (length=10) 
       'model_id' => string '288' (length=3) 
       'model_year' => string '2010' (length=4) 
       'model_model' => string '159' (length=3) 
     1 => 
      array 
       'make_id' => string '33' (length=2) 
       'make_make' => string 'Alfa-romeo' (length=10) 
       'model_id' => string '289' (length=3) 
       'model_year' => string '2010' (length=4) 
       'model_model' => string 'MiTo' (length=4) 
     2 => 
      array 
       'make_id' => string '33' (length=2) 
       'make_make' => string 'Alfa-romeo' (length=10) 
       'model_id' => string '290' (length=3) 
       'model_year' => string '2010' (length=4) 
       'model_model' => string '159 SPORTWAGON' (length=14) 

Le problème est avec la deuxième requête qui retourne make.id qui est utilisé dans la troisième requête pour sélectionner 1 marque (Alfa-Romeo, qui dispose de 3 modèles) . Ce que je veux, c'est retourner NOMBRE DE combinaisons de marques/modèles.

Si je change nombre d'articles retournés dans Doctrine_Pager à 2, je reçois 33 lignes (parce que de deux sélectionnés rend Alfa-Romeo dispose de 3 modèles et Audi (qui est à côté) dispose de 30 modèles.

Où je m faire une erreur?

Répondre

1

Vous ne pouvez pas combiner plusieurs colonnes dans un seul groupe par. Essayez ceci ...

$q->groupBy('make.id'); 
$q->addGroupBy('model.id'); 

ou un peu plus comprimé ...

$q->groupBy('make.id')->addGroupBy('model.id');