Symfony : – Création des entités

13:14:12

Doctrine facilite la gestion des bases de données relationnelles en permettant de manipuler des entités PHP au lieu d’écrire directement des requêtes SQL. Cet article détaille la création des entités et leur configuration (ou mapping) pour une utilisation optimale avec Doctrine.

Conception des Entités

Exemple de classe d’entité

Prenons l’exemple d’une application qui gère des livres, chaque livre ayant un id, un titre, et une date de parution. Voici une entité définissant ces propriétés :

namespace App\Entity;

class Livre
{
    private $id;
    private $titre;
    private $dateParution;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setTitre(?string $titre): self
    {
        $this->titre = $titre;
        return $this;
    }

    public function getTitre(): ?string
    {
        return $this->titre;
    }

    public function setDateParution(?\DateTimeInterface $dateParution): self
    {
        $this->dateParution = $dateParution;
        return $this;
    }

    public function getDateParution(): ?\DateTimeInterface
    {
        return $this->dateParution;
    }
}
Points importants : Propriétés privées : Les propriétés des entités doivent toujours être privées ou protégées, jamais publiques. Accesseurs et mutateurs (getters/setters) : Ces méthodes permettent d’accéder aux données ou de les modifier, tout en respectant les principes d’encapsulation. Syntaxes pour le Mapping des Entités Le mapping consiste à associer une classe PHP (entité) à une table de base de données, ainsi que ses propriétés aux colonnes de cette table. Doctrine prend en charge plusieurs formats pour le mapping : Annotations Attributs PHP (par défaut avec Symfony 6+) Fichiers YAML Fichiers XML Exemple de mapping avec les attributs PHP Les attributs PHP sont intégrés directement dans le code et permettent une configuration claire et rapide : namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\DBAL\Types\Types; #[ORM\Entity] #[ORM\Table(name: 'livre')] class Livre { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: Types::INTEGER)] private ?int $id = null; #[ORM\Column(type: Types::STRING, length: 255)] private ?string $titre = null; #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] private ?\DateTimeInterface $dateParution = null; } Commande pour synchroniser le schéma Une fois les entités créées et mappées, synchronisez votre base de données avec la commande : php bin/console doctrine:schema:update --force Pour afficher les requêtes SQL générées sans appliquer les modifications : php bin/console doctrine:schema:update --dump-sql Le Mapping des Entités Simples a) Attribut #[ORM\Entity] Cet attribut marque une classe comme une entité utilisable par Doctrine. Exemple : #[ORM\Entity] class MonEntite { // ... } b) Attribut #[ORM\Column] Configure une propriété pour qu’elle soit associée à une colonne de la table : #[ORM\Column(type: Types::STRING, length: 255, nullable: true)] private ?string $nom = null; Propriétés courantes de #[ORM\Column] : type : Type de données (ex. Types::STRING , Types::DATE ). length : Longueur pour les colonnes de type STRING . nullable : Autorise les valeurs NULL . unique : Crée un index unique sur la colonne. c) Attribut #[ORM\Table] Permet de configurer des options liées à la table, comme son nom : #[ORM\Table(name: 'membre')] class Utilisateur { // ... } d) Clés Primaires Une clé primaire se configure avec l’attribut #[ORM\Id] . Si la base doit générer automatiquement la valeur de cette clé, utilisez également #[ORM\GeneratedValue] : #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: Types::INTEGER)] private ?int $id = null; e) Index et Contraintes Uniques Pour créer un index simple ou multi-colonnes : #[ORM\Table(name: 'ma_table')] #[ORM\Index(name: 'multi_idx', columns: ['col_1', 'col_2'])] class MonEntite { /* ... */ } Pour créer une contrainte unique multi-colonnes : #[ORM\Table(name: 'membre')] #[ORM\UniqueConstraint(name: 'uniq', columns: ['nom', 'prenom'])] class Utilisateur { /* ... */ } Mapping des Relations (Clés Étrangères) Les relations entre entités s’appuient sur leur cardinalité : 1-1 : Une entité A correspond à une entité B. 1-n : Une entité B est associée à plusieurs entités A. n-n : Plusieurs entités A sont associées à plusieurs entités B. a) Relation #[ORM\OneToOne] (1-1) #[ORM\OneToOne(targetEntity: 'Auteur')] #[ORM\JoinColumn(name: 'auteur_id', referencedColumnName: 'id')] private ?Auteur $auteur = null; b) Relation #[ORM\ManyToOne] (n-1) #[ORM\ManyToOne(targetEntity: 'App\Entity\Livre')] private ?Livre $livre = null; c) Relation #[ORM\ManyToMany] (n-n) #[ORM\ManyToMany(targetEntity: 'Theme')] #[ORM\JoinTable(name: 'livre_theme')] private Collection $themes; Outils de la Console Symfony Symfony fournit plusieurs commandes pour gérer les entités et leur mapping. a) Vérifier le mapping Validez le mapping des entités avec : php bin/console doctrine:schema:validate b) Générer le schéma Voir les requêtes SQL : php bin/console doctrine:schema:update --dump-sql Appliquer les modifications : php bin/console doctrine:schema:update --force Documentation Symfony - Doctrine ORM Documentation Doctrine ORM Le mapping des entités est une étape essentielle pour structurer et gérer vos données avec Doctrine. Grâce à ses outils et à son intégration avec Symfony, Doctrine offre une méthode robuste pour définir, manipuler et synchroniser vos entités avec la base de données, tout en simplifiant le développement et la maintenance des applications web.
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\/4968\/et-divi-dynamic-tb-8749-tb-7217-tb-6415-4968-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":"207e628c75","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"3d8dc6054b","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":"4968","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":"f107b17322","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; }