Doctrine
Création d'une entité
En ligne de commande pour créer l'entité chose:
$ php app/console generate:doctrine:entity
Une série d'information est demandée
- le nom de l'entité
The Entity shortcut name: MachinTrucBundle:Chose
Il faut être vigilant avec la syntaxe.
- le format de configuration
Configuration format (yml, xml, php, or annotation) [annotation]:
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é
namespace Machin\TrucBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Chose * * @ORM\Table(name="chose") * @ORM\Entity(repositoryClass="Machin\TrucBundle\Entity\ChoseRepository") */ class Chose {
Paramètres des champs/column
/** * @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;
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.
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; }
OneToOne Bidirectionnel
C'est bidirectionnel, mais c'est bien dans la table Client qu'on enregistre l“id” de la carte.
/* * @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; } }Et côté carte :
/* * @ORM\Entity(name="carte") */ class Carte { ... /** * @ORM\OneToOne(targetEntity="Machin\TrucBundle\Entity\Client", mappedBy="carte") */ private $client; ... public getClient(){ return $this->client; } }
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.
/* * @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; } }Et côté carte
/* * @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; } }
ManyToMany
Par exemple des Livres et des Auteurs. On a donc une table de liaison livres_auteurs.
/* * @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(); } }
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
php app/console doctrine:database:create
Pour voir la/les requêtes SQL qui crée/modifie la base
php app/console doctrine:schema:update --dump-sql
Pour exécuter les requêtes
php app/console doctrine:schema:update --force