Les différents moyens d’exécution d’une requête Doctrine2

Pour exécuter une requête Doctrine, il y’a plusieurs façons de faire à partir du Query Builder Doctrine2.

Doctrine2: Récupérer une collection de résultats

Exemple de requête à exécuter:

  $q = $this->createQueryBuilder('p')
->where('p.state = :state')
->setParameter('state', $state);

Récupérer tous les posts valides.

$q->getQuery()->execute();

Va permettre de retourner une collection d’objets (\Doctrine\Common\Collections\ArrayCollection()) de notre entité Post.

execute() a un équivalent:

$q->getQuery()->getResult()

Doctrine2: Récupérer un seul résultat

Si nous souhaitons récupérer une seule entrée avec Doctrine dans Symfony2:

$q = $this->createQueryBuilder('p')
->where('p.id = :post')
->setParameter('post', $idPost);

Il suffit d’utiliser getSingleResult() ou getOneOrNullResult().

$q->getQuery()->getOneOrNullResult()

L’avantage de getOneOrNullResult() et qu’il retournera null si aucune donnée n’est trouvée, contrairement à getSingleResult() qui déclenchera une erreur.

Doctrine2: Récupérer uniquement une valeur

Dans le cas d’un count() par exemple, nous ne souhaitons récupérer qu’une seule valeur avec notre requête:

$q = $this->createQueryBuilder('p')
          ->select('COUNT(p)');
On exécute la requête du Query Builder avec getSingleScalarResult()
$q->getQuery()->getSingleScalarResult();

Doctrine2: Récupérer les données en tableau

Et si vous ne souhaitez pas récupérer vos données sous forme d’objet, vous pouvez les récupérer formatées en tableau:
   $q = $this->createQueryBuilder('p')
->where('p.state = :state')
->setParameter('state', $state);

Récupérer tous les posts valides.

$q->getQuery()->getScalarResult();
OU
$q->getQuery()->getArrayResult();

Créer une requête SQL native dans Symfony2 avec Doctrine2

Il peut être intéressant voir obligatoire dans certains cas complexes d’avoir recours aux requêtes SQL native directement dans Symfony2, tout en passant par l’ORM et en récupérant des objets à la suite de cette requête.

Voici un exemple d’utilisation dans un Repository Symfony2:

use Doctrine\ORM\Query\ResultSetMapping;
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Novaway\Bundle\CmsBundle\Entity\Project', 'p');
$rsm->addFieldResult('p', 'id', 'id');
$rsm->addFieldResult('p', 'title', 'title');

$sql = 'SELECT p.id, p.title FROM project p JOIN project_related pr ON p.id = pr.related_project_id WHERE pr.project_id = ?';

$query = $this->_em->createNativeQuery($sql, $rsm);
$query->setParameter(1, $idProject);

$projects = $query->getResult();