This page is not translated yet!
Les tables d'une base de données sont souvent liées entre elles. Ces relations peuvent être classées en trois catégories :
EntityPHP gère bien entendu tous ces types de liaisons. Cela dit, par soucis de simplicité, les liaisons One to one se gèrent de la même manière que les liaisons One to many.
Reprenons l'exemple de notre classe Characters. Nous allons créer une classe PetMonsters qui symbolisera un "monstre de compagnie" possédé par un personnage. Il s'agira donc d'une relation One to One : un monstre ne sera possédé que par un personnage qui ne possédera qu'un monstre.
<?php class PetMonsters extends Entity { protected $name = '255'; protected $life = 11; protected $dateCreation = 'DATE'; public function __construct ( $_name = 'Bibi', $_life = 50 ) { $this->name = $_name; $this->life = $_life; $this->dateCreation = new DateTime(); } } ?>
Il nous faut maintenant faire un choix : soit nous marquons la liaison entre les deux classes du côté de Characters, soit nous la marquons du côté de PetMonsters. Il est important de ne pas la marquer sur les deux classes afin d'éviter un doublon de données dans la base.
Ce choix n'importe au final que très peu, il s'agit plus d'une question de logique : pour notre exemple, nous considérons que c'est un personnage qui possède un monstre, et non l'inverse. La liaison se fera donc du côté de la classe Characters.
Pour ce faire, il suffit de créer une nouvelle propriété et lui définir le nom de la classe à lier, en tant que chaîne de caractères :
<?php class Characters extends Entity { //Propriétés précédentes protected $monster = 'PetMonsters'; public function __construct ( //Propriétés précédentes $_monster = null ) { //Propriétés précédentes $this->monster=$_monster; } } ?>
Ensuite, un appel à la méthode Entity :: createDatabase ( ) ; nous générera ceci :
La table PetMonsters a été générée comme on l'a déjà vu. Concernant la table Characters, un champ id_monster a été ajouté. Ce nouveau champ est une clé étrangère vers la table PetMonsters.
Regardons maintenant les données des deux tables :
Notre table Characters contenait déjà une entrée. Afin d'éviter d'éventuels soucis liés à la clé étrangère nouvellement ajoutée, une entrée a été créée dans la table PetMonsters. On peut constater que, bien entendu, elles contient les valeurs par défaut définies dans le constructeur.
Bien entendu, si la table Characters est vide au moment de la mise à jour de sa structure, aucune donnée ne sera ajoutée dans la table PetMonsters.
Afin d'illustrer ce type de liaison, nous allons créer une classe Objects, qui représentera des types d'objets :
<?php class Objects extends Entity { protected $name = '255'; protected $price = 10.2; public function __construct ( $_name = 'potion', $_price = 9.99 ) { $this->name = $_name; $this->price = $_price; } } ?>
Un personnage peut posséder plusieurs objets, et un objet peut être possédé par plusieurs personnages : il s'agit donc bien d'une relation Many to Many.
Ce type de liaison se créé de la même manière que précédement : via une propriété dans une (et une seule) des deux classes concernées.
Comme pour les monstres, nous considérerons que les personnages possèdent des objets, et non l'inverse. Modifions donc à nouveau la classe Characters.
Une relation Many to Many se fait en créant une propriété ayant comme valeur un tableau ne contenant qu'une donnée : le nom de la classe à lier :
<?php class Characters extends Entity { //Propriétés précédentes protected $monster = 'PetMonsters'; protected $objects = array('Objects'); public function __construct ( $_name = 'Toto', $_life = 100, $_description = '...', $_status = 'Normal', $_monster = null ) { //Propriétés précédentes $this->monster=$_monster; $this->objects=array(); } } ?>
Après un appel à la méthode Entity :: createDatabase ( ) ;, deux tables seront générées :
En pratique, vous n'aurez jamais à vous pré-occuper de toutes les tables générées par EntityPHP : la librairie s'occupe en effet seule des différentes jointures !