Doctrine avancé — Formation Symfony 7

Dans ce chapitre je vous propose de voir quelques notions avancées concernant doctrine qui vous permettront d’améliorer les performances et d’écrire des requêtes plus complexes.

Select partiel

Doctrine est pensé par défaut pour hydrater des entités et ses requêtes sélectionneront systématiquement l’ensemble des champs de l’entité. Cependant dans certaines situations on n’a pas besoin de forcément tout récupérer. Dans cette situation il est possible d’utiliser la méthode select() sur le queryBuilder pour spécifier les champs souhaités.

$recipes = $this
    ->createQueryBuilder('r')
    ->select('r.id', 'r.name')
    ->getQuery()
    ->getResult()

Dans ce cas là chaque enregistrement sera renvoyé sous forme de tableau associatif. Mais on va aussi pouvoir construire des objets qui serviront à représenter nos données (ce qui permet ensuite un typage). Pour cela on peut utiliser l’opérateur NEW de doctrine.

$recipes = $this
    ->createQueryBuilder('r')
    ->select('NEW App\DTO\LightRecipeDTO(r.id, r.name)')
    ->getQuery()
    ->getResult()

Cela utilisera le constructeur de l’objet en lui passant les champs sélectionnés (on ne peut utiliser que des données scalaires).

DQL : Doctrine Query Language

Doctrine offre aussi un langage particulier appelé DQL qui est un langage proche du SQL mais qui permet les requêtes sur les objets plutôt que les tables.

<?php
$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.age > 20');
$users = $query->getResult();

Pour plus de détail sur les fonctionnalités du DQL n’hésitez pas à vous rendre sur la documentation de Doctrine