Notice: Use of undefined constant NONE - assumed 'NONE' in /home/developpez/www/developpez-com/upload/entityphp/index.php on line 21
EntityPHP • Defining tables relationships
EntityPHP

This page is not translated yet!

Adding links between tables

  1. Les types de liaisons
  2. Les relations One to One|One to Many
  3. Les relations Many to Many

Les types de liaisons

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.

Les relations One to One|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 :

EntityPHP
Table Characters

EntityPHP
Table PetMonsters

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 :

EntityPHP
Contenu de la table Characters

EntityPHP
Contenu de la table PetMonsters

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.

Les relations Many to Many

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 :

EntityPHP
La table Objects, bien entendu

EntityPHP
Et une table de liaisons, Characters2Objects

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 !