Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

code:php:symfony2:doctrine [12/11/2015 20:50]
elisabeth [Pour voir la/les requêtes SQL qui crée/modifie la base]
code:php:symfony2:doctrine [15/06/2018 22:22]
Ligne 1: Ligne 1:
-====== Doctrine ====== 
-===== Création d'une entité ===== 
-En ligne de commande pour créer l'​entité chose: 
-<note tip><​code>​$ php app/console generate:​doctrine:​entity</​code></​note>​ 
-Une série d'​information est demandée 
-  - le nom de l'​entité <​code>​The Entity shortcut name: MachinTrucBundle:​Chose</​code>​ Il faut être vigilant avec la syntaxe. 
-  - le format de configuration <​code>​Configuration format (yml, xml, php, or annotation) [annotation]:</​code>​ Là on choisit annotation 
-  - les champs que l'on veut définir ... 
  
-Et doctrine fait tout le boulot! 
- 
- 
- 
-===== Les annotations ===== 
-Lors de la création de l'​entité avec doctrine, un minimum d'​annotations est réalisées. 
-Doctrine crée automatiquement un champ $id, clé primaire. Les getters et les setters sont déjà prêts. 
-==== Pour l'​entité ==== 
- 
-<code php> 
-namespace Machin\TrucBundle\Entity;​ 
- 
-use Doctrine\ORM\Mapping as ORM; 
-/** 
- ​* ​ Chose 
- * 
- * @ORM\Table(name="​chose"​) 
- * @ORM\Entity(repositoryClass="​Machin\TrucBundle\Entity\ChoseRepository"​) 
- */ 
- 
-class Chose 
-{ 
-</​code>​ 
-====  Paramètres des champs/​column ==== 
-<​note>​L'​ensemble des types possibles est:  string, integer, smallint, bigint, boolean, decimal, datetime, time, text, object, array, float.</​note>​ 
-<code php> 
-    /** 
-     * @var integer 
-     * 
-     * @ORM\Column(name="​id",​ type="​integer"​) 
-     * @ORM\Id 
-     * @ORM\GeneratedValue(strategy="​AUTO"​) 
-     */ 
-    private $id; 
-    ​ 
-    /** 
-     * @var string 
-     * 
-     * @ORM\Column(name="​name",​ type="​string",​ length=150, nullable=false,​ unique=true) 
-     */ 
-    private $name; 
-    ​ 
-    /** 
-     * @var decimal 
-     * 
-     * @ORM\Column(name="​size",​ type="​decimal",​ precision=3,​ scale=2) 
-     */ 
-    private $size; 
-</​code>​ 
-==== Relation et JoinColumn ==== 
-=== Paramètres === 
-== Pour la relation == 
- 
-  * **targetEntity** : REQUIS - l'​entité à laquelle est liée la première (nom complet) ​ 
-  * **cascade** : objet comme par exemple ​ {"​remove",​ "​persist"​} 
-    *  "​remove"​ pour suppression en cascade 
-    *  "​persist"​ pour insertion élément d'un sous-formulaire ​ 
-    *  ... 
-  * **fetch** : LAZY ou EAGER (LAZY ne charge que l'​entité courante, EAGER charge aussi la (les) entité(s) liée(s)). LAZY par défaut 
-  * **inversedBy** : champ inverse dans l'​autre entité (bi-directionnel,​ dans chacune des entités je veux accéder à l'​autre) 
-  * **mappedBy**:​ le champ de l'​autre entité correspondant (bi-directionnel) 
-== Pour JoinColumn == 
- 
-  * **nullable** : entité reliée requise ou non, par défaut nullable vaut true (pas requise) 
-  * **name**: nom de la colonne de la table sur laquelle se fait la jointure (foreign key) 
-  * **referencedColumnName** : le nom de la colonne dans l'​autre table sur laquelle se fait la jointure (foreign key) 
-=== OneToOne Unidirectionnel === 
-Par exemple, on a un Client auquel est lié une Carte. ​ 
-<code php> 
-class Client 
-{ 
-     ... 
-     // JoinColumn n'est pas utile ici, 
-    /** 
-     * @ORM\OneToOne(targetEntity="​Machin\TrucBundle\Entity\Carte",​ cascade={"​remove",​ "​persist"​}) 
-     * @ORM\JoinColumn(name="​carte_id",​ referencedColumnName="​id",​ nullable=true) 
-     */ 
-     ​private $carte; 
-     ... 
-     ​public setCarte(Carte $carte){ 
-        $this->​carte = $carte; 
-     } 
-</​code>​ 
-=== OneToOne Bidirectionnel === 
- ​C'​est bidirectionnel,​ mais c'est bien dans la table Client qu'on enregistre l"​id"​ de la carte. 
-<code php> 
-/* 
- * @ORM\Entity(name="​client"​) 
- */ 
-class Client 
-{ 
-     ... 
-    /** 
-     * @ORM\OneToOne(targetEntity="​Machin\TrucBundle\Entity\Carte",​ inversedBy="​client"​ , cascade={"​remove",​ "​persist"​}) 
-     * @ORM\JoinColumn(name="​carte_id",​ referencedColumnName="​id",​ nullable=false) 
-     */ 
-     ​private $carte; 
-     ... 
-     ​public function setCarte(Carte $carte) 
-     { 
-        $this->​carte = $carte; 
-     } 
-     ​public function getCarte() 
-     { 
-        return $this->​carte;​ 
-     } 
- } 
- 
-/* 
- * @ORM\Entity(name="​carte"​) 
- */ 
-class Carte 
-{ 
-     ... 
-    /** 
-     * @ORM\OneToOne(targetEntity="​Machin\TrucBundle\Entity\Client",​ mappedBy="​carte"​) 
-     */ 
-     ​private $client; 
-     ... 
-     ​public getClient(){ 
-        return $this->​client;​ 
-     } 
- } 
-</​code>​ 
-=== OneToMany et ManyToOne === 
-Cette fois-ci,le client peut avoir plusieurs cartes, mais c'est dans la table carte qu'on enregistre l'id du client! 
-Et c'est bi-directionnel. 
-<code php> 
-/* 
- * @ORM\Entity(name="​client"​) 
- */ 
-class Client 
-{ 
-     ... 
-    /** 
-     * @ORM\OneToMany(targetEntity="​Machin\TrucBundle\Entity\Carte",​ mappedBy="​client"​ , cascade={"​remove",​ "​persist"​}) 
-     */ 
-     ​private $cartes; 
-     ... 
-     ​public function __construct() { 
-        $this->​cartes = new ArrayCollection();​ 
-     } 
-     ​public function addCarte(Carte $carte) 
-     { 
-        $this->​cartes[] = $carte; 
-        return $this; 
-     } 
-     ​public function removeCarte(Carte $carte) 
-     { 
-        $this->​cartes->​removeElement($carte);​ 
-        return $this; 
-     } 
-     ​public getCartes() 
-     { 
-        return $this->​cartes;​ 
-     } 
-      
- } 
- 
-/* 
- * @ORM\Entity(name="​carte"​) 
- */ 
-class Carte 
-{ 
-     ... 
-    /** 
-     * @ORM\ManyToOne(targetEntity="​Machin\TrucBundle\Entity\Client",​ inversedBy="​cartes"​) 
-     * @ORM\JoinColumn(name="​client_id",​ referencedColumnName="​id"​) 
-     */ 
-     ​private $client; 
-     ... 
-     ​public getClient(){ 
-        return $this->​client;​ 
-     } 
- } 
-</​code>​ 
-=== ManyToMany === 
-Par exemple des Livres et des Auteurs. On a donc une table de liaison livres_auteurs. 
-<code php> 
-/* 
- * @ORM\Entity(name="​auteur"​) 
- */ 
-class Auteur 
-{ 
-     ... 
-    /** 
-     * @ORM\ManyToMany(targetEntity="​Machin\TrucBundle\Entity\Livre",​ mappedBy="​auteurs"​ , cascade={"​persist"​}) 
-     */ 
-     ​private $livres; 
-     ... 
-     ​public function __construct() { 
-        $this->​livres = new ArrayCollection();​ 
-     } 
- 
- } 
- 
-/* 
- * @ORM\Entity(name="​livre"​) 
- */ 
-class Livre 
-{ 
-     ... 
-    /** 
-     * @ORM\ManyToMany(targetEntity="​Machin\TrucBundle\Entity\Auteur",​ inversedBy="​livres"​) 
-     * @ORM\JoinTable(name="​livres_auteurs"​) 
-     */ 
-     ​private $auteurs; 
-     ... 
-     ​public function __construct() { 
-        $this->​auteurs = new ArrayCollection();​ 
-     } 
- } 
-</​code>​ 
-=== Autres === 
-On peut faire plein d'​autres liaisons, des liaisons d'une entités sur elle-même. 
-[[http://​doctrine-orm.readthedocs.org/​projects/​doctrine-orm/​en/​latest/​reference/​association-mapping.html]] 
-===== Base de données ===== 
-Une fois créées toutes les entités, on peut en ligne de commandes avec doctrine, tout mettre à jour. 
-==== Pour créer la base de données ==== 
-<note important> ​ Voir aussi le paramétrage pour la base de données [[code:​php:​symfony2:​parametre#​parametre.yml|paramétrages de Symfony2]]</​note>​ 
-<​code>​php app/console doctrine:​database:​create</​code>​ 
-==== Pour voir la/les requêtes SQL qui crée/​modifie la base ==== 
- 
-<​code>​php app/console doctrine:​schema:​update --dump-sql</​code>​ 
-==== Pour exécuter les requêtes ==== 
-  
-<​code>​php app/console doctrine:​schema:​update --force</​code>​ 
- 
-===== Les Repositories ===== 
- 
-[[code:​php:​symfony2:​parametre|Paramétrage]]