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

11 réflexions au sujet de « Créer une requête SQL native dans Symfony2 avec Doctrine2 »

  1. Au lieu de mapper manuellement chacun des champs, on peut utiliser Doctrine\ORM\Query\ResultSetMappingBuilder qui va ajouter tous les champs d’une entité.
    En 2 lignes :
    $rsm = new ResultSetMappingBuilder($this->getEntityManager());
    $rsm->addRootEntityFromClassMetadata(‘MonBundle:MonEntite’, ‘alias’);

  2. Hello,

    Super intéressant, merci de l’info. Par contre comment fais-je pour récupérer les informations en objet.

    J’essaie d’accéder à mes infos de facon habituelle mais il dit que je ne travaille pas sur un objet…

    Tu peux m’expliquer comment accéder à mon objet?

    A+

  3. Bonjour ,
    Merci pour le boup de code , je l’ai essayé , ca marche Nickel , mais il parait que il manque quelque chose de plus .
    par exemple je veux afficher autre champs d’une autre classe , pour votre cas les champs de l’alias ‘ pr ‘ .
    du coup si je met :
    $rsm->addFieldResult(‘pr’, ‘champ’, ‘champ’);
    ca se produit un erreur comme suit :
    Notice: Undefined index: id in chamin/nom/du/class

    vous avez des idées svp ?

  4. Ping : Symfony2 直接SQLを実行 - LOCAL COLOR BLOG

  5. bonjour,
    est ce que pour un simple join Doctrine devient trop complexe? au vu de ta requête. Je lutte un peu avec les join c’est pour ça que je le dis

    • Non, il est tout à fait possible de faire des joins et d’effectuer des requêtes complexes en DQL (doctrine query language).

      exemple:
      $result = $em->createQueryBuilder(‘entity’)->leftJoin(‘entity.otherEntity’, ‘oe’)->addSelect(‘oe’)->orderBy(‘e.position’,'ASC’)->getQuery()->getResult();

  6. Ping : Procédures stockées Symfony2 avec Doctrine2 | Tony BRAMNIK

  7. Bonjour et bravo pour ce blog de développeur SF2. Effectivement doctrine est un outil très puissant et je recommande à mes dev de l’utilise. D’ailleurs, pour faire du bon boulot en création de site internet ou d’outils métiers, nous n’avons pas trop le choix ! En tout cas, ce type est très complet et je me permettrai de le consulter un peu plus souvent. @ ++

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>