This page is not translated yet!
Nous avons vu qu'il était facile de modifier les données simples de nos entités. Qu'en est-il des propriétés contenant d'autres entités ?
Pour en revenir à nos exemples, comment faire pour qu'un personnage change de monstre de compagnie ? Et comment lui ajouter des objets dans son inventaire ?
La façon de procéder est pour ainsi dire identique : il suffit de récupérer le personnage à mettre à jour, modifier la propriété voule et sauvegarder le tout en base.
Récupérons tout d'abord le personnage à modifier via la méthode getById() que nous avons déjà vue :
<?php $obj = Characters::getById(1); if(!is_null($obj)) { //Modifications ici } ?>
Notre base de données ne contient pour le moment qu'un seul monstre. Il nous faut en créer un second afin de pouvoir modifier celui de notre perosnnage !
<?php $obj = Characters::getById(1); if(!is_null($obj)) { $monster = PetMonsters::add( new PetMonsters('Medor',80) ); } ?>
La méthode add() retourne l'entité qui a été ajoutée : notre nouveau monstre sera alors enregistré en base et stocké dans la variable $monster.
Il nous faut maintenant ajouter une méthode setMonster() à notre classe Characters afin de pouvoir modifier le monstre.
<?php class Characters extends Entity { //[...] => Autres propriétés et méthodes public function setMonster(PetMonsters $_monster) { $this->monster = $_monster; } } ?>
Revenons alors à notre code précédent et modifions notre personnage !
<?php $obj = Characters::getById(1); if(!is_null($obj)) { $monster = PetMonsters::add( new PetMonsters('Medor',80) ); $obj->setMonster($monster); Characters::update($obj); } ?>
Avant de voir comment mettre à jour les données d'une relation Many to Many, il serait bon d'enregistrer quelques objets dans notre base :
<?php $smallLife = Objects::add(new Objects('Petite potion de soin',3)); $normalLife = Objects::add(new Objects('Potion de soin',5)); $bigLife = Objects::add(new Objects('Grande potion de soin',8)); $smallMana = Objects::add(new Objects('Petite potion de mana',4)); $normalMana = Objects::add(new Objects('Potion de mana',6)); $bigMana = Objects::add(new Objects('Grande potion de mana',9)); ?>
Il nous sera ainsi possible de modifier l'inventaire de notre personnage.
Pour rappel, celui-ci est symbolisé par la propriété
protected
$objects
=
array('Objects')
de notre classe Characters.
Afin d'éviter des soucis de chargements de ressources inutiles, cette propriété et les entités qu'elle contient ne sont pas chargées lors de la récupération de notre personnage.
Il est nécessaire d'appeler la méthode load(). Elle prend en paramètre le nom de la propriété à charger :
<?php //[...] => Enregistrement des objets dans la base $obj = Characters::getById(1); if(!is_null($obj)) { //Chargement des objets du personnage $obj->load('objects'); } ?>
La propriété $objects n'est alors plus un simple tableau, mais une instance de EntityArray.
Cette nouvelle classe s'utilise de la même manière qu'un tableau tradionnel, elle apporte juste quelques méthodes en plus. Elle impose également une restriction : elle ne peut contenir que des instances du même type. Ainsi, $objects ne pourra contenir que des instances de Objects (ce qui, en soit, nous arrange plutôt bien).
Admettons que nous ayons défini une méthode getObjects() dans notre classe Characters qui nous retourne cette propriété, nous pouvons alors écrire ceci :
<?php //[...] => Enregistrement des objets dans la base $obj = Characters::getById(1); if(!is_null($obj)) { //Chargement des objets du personnage $obj->load('objects'); //On ajoute des objets dans l'inventaire $obj->getObjects() ->push($smallLife)->push($smallLife) ->push($smallLife)->push($normalLife) ->push($bigLife)->push($smallMana) ->push($smallMana)->push($bigMana); //On enregistre nos modifications ! Characters::update($obj); } ?>
La méthode push() de EntityArray permet de rajouter une entité à la fin du tableau. Elle retourne l'instance de EntityArray appelante, il est donc possible de chaîner les appels comme on l'a fait dans l'exemple ci-dessus.
EntityArray propose également deux méthodes de suppression d'éléments : removeIndex()
et remove(). La première supprime simplement l'entité située dans le tableau à l'index indiqué.
La seconde permet de supprimer l'entité donnée en paramètre. Si celle-ci est présente plusieurs fois dans le tableau, seule la première occurence trouvée sera supprimée. Si vous souhaitez
supprimer toutes les occurences, passez simplement false en second paramètre de la méthode :
<?php $obj = Characters::getById(1); if(!is_null($obj)) { //Chargement des objets du personnage $obj->load('objects'); //On ajoute des objets dans l'inventaire $obj->getObjects() ->removeIndex(3) //Suppression de l'objet se situant à l'index 3 du tableau ->remove(Objects::getById(1)) //Suppression d'une petite potion de soin ->remove(Objects::getById(4), false); //Suppression de toutes les petites potions de mana //On enregistre nos modifications ! Characters::update($obj); } ?>