symfony2 - Doctrine - Comment faire un select multiple, avec un nombre de groupe et par
Dans Symfony2 et Doctrine, je voudrais exécuter une requête qui retourne un nombre et un groupe de par.
Voici ce que j'ai essayé. C'est le SQL je veux courir:
SELECT `terrain_id` , COUNT( * )
FROM `Partie`
WHERE 1 =1
GROUP BY `terrain_id`
Avec mon entité:
class Partie
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Gp\UserBundle\Entity\User",
inversedBy="parties", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="Gp\JeuxBundle\Entity\Terrain")
*/
private $terrain;
C'est mon PartieRepository
public function getTest(\Gp\UserBundle\Entity\User $user){
return $this->createQueryBuilder('p')
->select('count(p), p.terrain')
->where('p.user = :user')
->setParameter('user', $user)
->groupBy('r.terrain')
->getQuery()
->getResult();
}
C'est l'erreur que je reçois:
[Semantical Error] line 0, col 19 near 'terrain FROM': Error:
Invalid PathExpression. Must be a StateFieldPathExpression.
OriginalL'auteur adrien_om | 2013-09-24
Vous devez vous connecter pour publier un commentaire.
Vous voudrez probablement aller avec un Requête Native
Simplement ajouter à tout avoir /où l'une des clauses en tant que de besoin.
Voici mon résultat:
Le manque de
terrain
dans le premier tableau est due à nullterrain_id
.MODIFIER
OP a des résultats inattendus, alors voici quelques étapes de dépannage:
1) Essayer une
var_dump($query->getSQL());
droit avant lareturn
déclaration, et exécuter le SQL directement à l'encontre de votre base de données. Si cela produit des résultats incorrects, d'examiner la requête et modifier le$sql
appropriées.2) Si #1 produit des résultats corrects, essayez un
var_dump($query->getResult());
droit avant l'instruction return. Si cela produit des résultats corrects, il se passe quelque chose de plus profond dans votre code. Il est temps de regarder pourquoiterrain
est filtré. Il peut être aussi simple que la suppression ou la modification de l'alias de SQL etaddScalarResult
.3) Essayez un moyen encore plus simple de la fonction:
Je ne suis pas sûr. Mon code de test fonctionne sur ma fin. Veuillez mettre à jour votre post original avec votre nouveau code et les résultats.
avez-vous de ce roi de la relation ?
** * @ORM\ManyToOne(targetEntity="Gp\JeuxBundle\Entity\Terrain") */ private $terrain;
Sont vos résultats présentés à partir d'un var_dump juste avant
return $query>getResult()
?Mon
terrain
propriété n'est pasprivate
, c'estprotected
. Mais j'ai essayé les deux, et qui ne semble pas faire une différence, au moins pas dans une Requête Native.OriginalL'auteur Rob
Cette erreur se produit sur cette ligne :
select('count(p), p.terrain')
où vous essayez d'utiliserp
alias qui n'existe plus. Leselect
méthode remplacer l'alias par défaut de lacreateQueryBuilder()
. Pour éviter cela, utilisezaddSelect
au lieu de spécifier clairement lefrom
méthode.Essayez ceci :
ou ceci :
[Semantical Error] line 0, col 94 near 'p WHERE user': Error: 'p' is already defined.
qu'elle est définie dans :$this->createQueryBuilder('p')
j'ai Donc essayé d'utilisé$this->getEntityManager()->createQuery()
au lieu de$this->createQueryBuilder('p')
mais j'obtiens l'erreur suivanteError: Call to undefined method Doctrine\ORM\Query::select()
Il ne fonctionne pas.
OriginalL'auteur S.Thiongane
Comment exécuter une crue de la Requête avec le comte et le groupe par:
D'accrocher votre manager et établir une nouvelle connexion:
De créer votre requête et fetchAll:
Obtenir les données de résultat comme ceci:
OriginalL'auteur Eric Leschinski