Symfony : – Gestion des entités

23:32:25

Doctrine fournit des outils performants et flexibles pour gérer les entités et interagir avec la base de données. Cette section explore comment récupérer, manipuler, et optimiser les requêtes pour les entités grâce aux repositories, au DQL (Doctrine Query Language), et au QueryBuilder.

 Le Repository : Centralisateur de Requêtes

a. Rôle du Repository

Un repository centralise toutes les requêtes liées à une entité spécifique. Bien que majoritairement utilisé pour des opérations de lecture (SELECT), il peut également contenir des méthodes pour insérer, modifier, ou supprimer des données.

Chaque entité dispose de son propre repository. Si aucun repository personnalisé n’est défini, Doctrine utilise une classe par défaut. Pour accéder au repository d’une entité, vous pouvez utiliser l’EntityManager et sa méthode

getRepository()

.

$repository = $this->em->getRepository(App\Entity\Livre::class);
$livre = $repository->find(1);
Dans cet exemple : getRepository() récupère le repository lié à l’entité Livre. find() retourne l’entité dont la clé primaire vaut 1 . b. Méthodes de Base Doctrine fournit des méthodes intégrées pour effectuer des requêtes courantes : find($id) Récupère une entité par sa clé primaire. Exemple : $livre = $repository->find(15); findAll() Retourne toutes les entités persistées en base sous forme de tableau. findOneBy(array $criteria) Recherche une entité correspondant aux critères spécifiés. Exemple : $livre = $repository->findOneBy(['titre' => '1984']); findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) Recherche plusieurs entités selon des critères, avec des options de tri et de pagination. Exemple : $livres = $repository->findBy( ['auteur' => 'George Orwell'], ['dateParution' => 'DESC'], 10, 0 ); c. Repositories Personnalisés Pour des besoins spécifiques, il est possible de créer des repositories personnalisés en étendant EntityRepository : Définir le Repository namespace App\Repository; use Doctrine\ORM\EntityRepository; class LivreRepository extends EntityRepository { public function rechercherParAuteur($auteur) { return $this->createQueryBuilder('l') ->andWhere('l.auteur = :auteur') ->setParameter('auteur', $auteur) ->getQuery() ->getResult(); } } Associer le Repository à l’Entité #[ORM\Entity(repositoryClass: LivreRepository::class)] class Livre { // ... } Le DQL : Doctrine Query Language Le DQL est un langage de requête inspiré du SQL mais conçu pour interagir avec les entités et leurs relations. Doctrine traduit automatiquement ces requêtes DQL en SQL pour la base de données. a. Syntaxe de Base SELECT : Permet de récupérer des entités. FROM : Définit l’entité principale. WHERE : Applique des filtres. JOIN : Réalise des jointures. Exemple simple : $query = $this->em->createQuery('SELECT l FROM App\Entity\Livre l WHERE l.titre = :titre'); $query->setParameter('titre', '1984'); $livre = $query->getOneOrNullResult(); b. Jointures Les jointures permettent de récupérer des entités liées sans écrire plusieurs requêtes. $query = $this->em->createQuery( 'SELECT l, a FROM App\Entity\Livre l JOIN l.auteur a WHERE a.nom = :nom' ); $query->setParameter('nom', 'Orwell'); $livres = $query->getResult(); JOIN : Jointure obligatoire. LEFT JOIN : Jointure optionnelle. c. Paramètres Les paramètres rendent les requêtes dynamiques et sécurisées. Vous pouvez utiliser : Paramètres nominatifs ( :nom ) : $query->setParameter('nom', 'Orwell'); Paramètres numérotés ( ?1 ) : $query->setParameter(1, 'Orwell'); Le QueryBuilder Le QueryBuilder est un outil puissant et lisible pour construire dynamiquement des requêtes DQL. Il évite les erreurs liées à la concaténation manuelle des chaînes de requêtes. a. Exemple Basique $qb = $this->em->createQueryBuilder(); $qb->select('l') ->from('App\Entity\Livre', 'l') ->where('l.auteur = :auteur') ->setParameter('auteur', 'Orwell'); b. Requête Dynamique Ajoutez des conditions de manière conditionnelle : $qb = $this->em->createQueryBuilder('l'); if ($pseudo) { $qb->andWhere('l.pseudo LIKE :pseudo') ->setParameter('pseudo', '%'.$pseudo.'%'); } return $qb->getQuery()->getResult(); c. Documentation Consultez la documentation officielle pour plus d'informations : QueryBuilder - Doctrine Pagination avec Doctrine Doctrine ne propose pas de LIMIT directement en DQL. Cependant, l’objet Query offre des méthodes pratiques : setMaxResults() : Limite le nombre de résultats. setFirstResult() : Définit un décalage pour la pagination. Exemple : $query = $this->em->createQuery('SELECT l FROM App\Entity\Livre l ORDER BY l.id'); $query->setFirstResult(($page - 1) * $nbParPage) ->setMaxResults($nbParPage); Recommandations Évitez les Requêtes Non Optimisées : Les jointures implicites (lazy loading) peuvent générer un grand nombre de requêtes SQL. Utilisez des jointures explicites avec JOIN pour limiter les appels. Cachez les Résultats des Requêtes : Doctrine permet de mettre en cache les résultats pour améliorer les performances des applications lourdes. Utilisez les Outils de Debug Symfony : Le profiler Symfony affiche le nombre de requêtes SQL exécutées. Référez-vous à la Documentation Officielle : Doctrine ORM Documentation Les repositories, le DQL et le QueryBuilder offrent une grande souplesse pour interagir avec vos entités et optimiser vos requêtes. En combinant ces outils avec des bonnes pratiques comme le cache et les jointures explicites, vous pouvez gérer efficacement les données dans une application Symfony robuste et évolutive.
par admin4460
Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter © MyCreaNet 2025 Mentions légales Plan du site Gestion des cookies Accessibilité
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/4975\/et-divi-dynamic-tb-8749-tb-7217-tb-6415-4975-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); var et_link_options_data = [{"class":"et_pb_post_title_0_tb_header","url":"https:\/\/mycreanet.fr\/dashboard\/","target":"_self"},{"class":"et_pb_code_0_tb_header","url":"https:\/\/mycreanet.fr\/work\/","target":"_self"}]; /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); /* ]]> */ /* <![CDATA[ */ ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2025-02-06 12:02:14+0000","generator":"GlotPress\/4.0.1","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"This contact form is placed in the wrong place.":["Ce formulaire de contact est plac\u00e9 dans un mauvais endroit."],"Error:":["Erreur\u00a0:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); /* ]]> */ /* <![CDATA[ */ var wpcf7 = { "api": { "root": "https:\/\/mycreanet.fr\/wp-json\/", "namespace": "contact-form-7\/v1" } }; /* ]]> */ /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"7a1d735d58","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"2c0130a4af","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"4975","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"581863a2bd","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var wpcf7_recaptcha = { "sitekey": "6LdTHXQrAAAAACmbbt7TJPkqCEfzcO8TdF_cEKX-", "actions": { "homepage": "homepage", "contactform": "contactform" } }; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }