2012-03-28 2 views
0
$qb = $this->createQueryBuilder('t'); 

    return $qb 
     ->join('t.customers', 'c') 
     ->where($qb->expr()->eq('t.user', $user->getId())) 
     ->andWhere($qb->expr()->gt($qb->expr()->count('c'), 0)) 
     ->orderBy('t.name')->getQuery()->getResult(); 

La requête ci-dessus (Doctrine2 généré un) me donne cette erreur:Obtenir "# 1111 - Utilisation incorrecte de la fonction de groupe" sans utiliser GROUP dans MySQL

#1111 - Invalid use of group function

mais la chose étrange est i » m n'utilise pas GROUP BY. Toute aide est très appréciée, merci.

SELECT t0_.id AS id0, 
     t0_.slug AS slug1, 
     t0_.name AS name2, 
     t0_.description AS description3, 
     t0_.user_id AS user_id4 
FROM tag t0_ 
    INNER JOIN customers_tags c2_ ON t0_.id = c2_.tag_id 
     INNER JOIN customer c1_ ON c1_.id = c2_.customer_id 
WHERE t0_.user_id = 1 AND COUNT(c1_.id) > 0 
ORDER BY t0_.name ASC 

Répondre

7

Vous utilisez une fonction d'agrégation count() dans la clause where qui est interdit.

Conditions sur les fonctions globales doivent entrer dans une clause HAVING

.... 
WHERE t0_.user_id = 1 
HAVING count(c1_.id) > 0 

Et bien sûr, vous aurez besoin d'utiliser GROUP BY pour obtenir des résultats corrects (bien que MySQL laissera probablement vous en sortir sans l'aide GROUP BY - mais les résultats sont imprévisibles)

0

« count » ne peut pas être utilisé dans où sans groupe par, le nombre est fonction « groupe »

2

Il n'y a pas besoin dans des jointures et havings. Il suffit d'utiliser la fonction SIZE:

$qb->where('SIZE(t.customers) = 0'); 

Cela vous donnera toutes les lignes sans clients attachés

+0

Monsieur, vous avez fait ma journée. Difficulté depuis 24h sur un moyen de faire une double vérification sur une collection de tableaux (élément spécifié dans la collection de tableaux OU la taille de la collection de tableaux est 0) Cela a parfaitement fait l'affaire. – YumeYume

+0

Cela devrait être la réponse acceptée :) –

Questions connexes