Doctrine : méthodes de base

Doctrine fournit un ensemble de méthodes prédéfinies permettant de récupérer aisément des informations provenant de la base de données.

Récupérer un objet à partir de son id : find et show

La méthode find prend en paramètre l'id et permet de créer et hydrater un objet. Par exemple si l'on souhaite récupérer un étudiant en fonction de son id :

$etudiant= $doctrine->getRepository(Etudiant::class)->find($id);

La méthode show peut être définie dans le contrôleur et permet également de récupérer un objet à partir de son id.

Il faut d'abord installer le composant nécessaire à l'utilisation du composant :

>composer require sensio/framework-extra-bundle
/* * @Route("/etudiant/{id}", name="etudiant_show") */ public function show(Etudiant $unEtudiant) { return $this->render('etudiant/consulter.html.twig', [ 'etudiant' => $unEtudiant,]); }

Vous voyez au passage dans les annotations, une autre façon de déclarer les routes.

Récupérer une liste d'objets : findAll

A partir de l'entité, il s'agit avec la méthode findAll de récupérer tous les objets correspondant à tous les enregistrements de la table. Par exemple la méthode ci-dessous permet de récupérer la liste des étudiants (d'où le s dans le nom de la variable $etudiants).

public function listerEtudiant(ManagerRegistry $doctrine){ $etudiants= $doctrine->getRepository(Etudiant::class)->findAll(); return $this->render('etudiant/lister.html.twig', [ 'pEtudiants' => $etudiants,]); }

Récupérer des objets selon plusieurs critères : findBy et findOneBy

Ces méthodes permettent de récupérer un seul(findOneBy) ou une liste d'objets (findBy) en fonctions de plusieurs critères. Par exemple si l'on souhaite récupérer un étudiant selon son nom et son prénom :

/** * @Route("/etudiant/consulterParNomPrenom/{nom}/{prenom}", name="consulterEtudiantParNomPrenom") */ public function consulterParNomPrenom(ManagerRegistry $doctrine, $nom,$prenom){ $repository = $doctrine->getRepository(Etudiant::class); $etudiant = $repository->findOneBy( ['nom' => $nom,'prenom' => $prenom ] ); return $this->render('etudiant/consulter.html.twig', [ 'etudiant' => $etudiant,]); }

Attention si plusieurs étudiants peuvent avoir le même nom et le même prénom, la requête peut donc potentiellement ramener plusieurs enregistrements. Il faudrait alors utiliser la méthode findBy et non findOneBy.

Méthodes spécifiques : EntitéRepository

Si les méthodes de base ne suffisent pas à récupérer les objets attendus, il est possible d'implémenter des méthodes spécifiques. Ces méthodes sont à positionner dans la classe repository de l'entité correspondante. Par exemple si l'on souhaite récupérer une liste d'étudiants dont la date de naissance est supérieure à une certaine date qui sera passée en paramètre, on ajoutera dans la classe EtudiantRepository la méthode ci-dessous :

public function consulterEtudiantParDateNaissSup($dateNaiss): array { $dateNaiss = new \DateTime(date($dateNaiss)); $qb = $this->createQueryBuilder('e') ->andWhere('e.dateNaiss > :pDateNaiss') ->setParameter('pDateNaiss', $dateNaiss) ->orderBy('e.nom', 'ASC') ->getQuery(); return $qb->execute(); }

La fonction est appelée alors dans le contrôleur de la même façon que les méthodes de base.

/** * @Route("/etudiant/consulterEtudiantsDateNaissSuperieur/{dateNaiss}", name="consulterEtudiantsDateNaissSuperieur") */ public function consulterEtudiantsDateNaissSuperieur($dateNaiss){ $etudiants = $this->getDoctrine() ->getRepository(Etudiant::class) ->consulterEtudiantParDateNaissSup($dateNaiss); return $this->render('etudiant/lister.html.twig', [ 'pEtudiants' => $etudiants,]); }

Tests : http://localhost/webstudent/public/etudiant/consulterEtudiantsDateNaissSuperieur/1980-07-30