This page is not translated yet!
Jusque là, nos sélections nous permettent de récupérer nos données qu'à travers des objets complets représentant nos entités.
Bien souvent, toutes les données ne sont pas utiles et nous n'avons besoin que d'une ou deux. Alors pourquoi tout charger ?
La classe EntityRequest possède une méthode, appelée select(), qui nous permet d'affiner nos requêtes.
Elle prend en paramètre une chaine de caractère contenant le nom des propriétés à récupérer, séparées par des virgules :
<?php $request = Characters::createRequest(); //On ne sélectionne que le nom et les points de vie des personnages $results = $request->select('name, life') ->exec(); echo '<pre>',var_dump($results),'</pre>'; ?>
array(4) { [0]=> object(stdClass)#4 (2) { ["name"]=> string(4) "Toto" ["life"]=> string(3) "100" } [1]=> object(stdClass)#5 (2) { ["name"]=> string(5) "Char1" ["life"]=> string(3) "200" } [2]=> object(stdClass)#6 (2) { ["name"]=> string(5) "Char2" ["life"]=> string(3) "130" } [3]=> object(stdClass)#7 (2) { ["name"]=> string(5) "Char3" ["life"]=> string(3) "120" } }
Faites bien attention : utiliser la méthode select()
modifie le type de retour de exec() !
Comme vous pouvez le constater, nous ne récupérons plus une instance de EntityArray, mais un simple tableau. Pourquoi ?
Comme expliqué dans le chapitre sur la modification des relations entre les tables, une instance de EntityArray ne peut contenir que des instances du même type d'Entity.
L'utilisation de select() nous permet de ne récupérer que les valeurs des propriétés indiquées, et non des entités entières : ces valeurs ne peuvent pas être stockées dans un EntityArray !
De plus, veuillez noter que le tableau récupéré contient des objets standards : ces objets n'ont pas accès aux différentes méthodes de vos classes héritant de Entity. Pensez bien également que modifier ces valeurs n'influencera en rien la base de données !
Ces objets ne servent donc que pour de la récupération de données, rien d'autre. Afin d'accéder à leurs propriétés, il suffit d'utiliser la syntaxe basique de l'orienté objet de PHP (les propriétés de ces objets standards étant publiques) :
<?php $request = Characters::createRequest(); //On ne sélectionne que le nom et les points de vie des personnages $results = $request->select('name, life') ->exec(); foreach($results as $obj) { echo $obj->name,' (',$obj->life,')<br />'; } ?>
Toto (100) Char1 (200) Char2 (130) Char3 (120)
Tout comme where() et orderBy(), select() accepte l'accès aux propriétés des entités liées à notre classe.
Ainsi, il est très facile de récupérer le nom de chaque monstre de chaque personnage :
<?php $request = Characters::createRequest(); //On récupère le nom de chaque personnage, ainsi que celui de leur monstre $results = $request->select('name, monster.name') ->exec(); foreach($results as $obj) { echo 'Le monstre de <b>',$obj->name,'</b> s\'appelle <b>',$obj->monster_name,'</b>.<br />'; } ?>
Le monstre de Toto s'appelle Medor. Le monstre de Char1 s'appelle Monster 1. Le monstre de Char2 s'appelle Monster 2. Le monstre de Char3 s'appelle Monster 3.
Remarquez que les propriétés des objets standards récupérées ont le même nom que les propriétés indiquées dans la maéthode select(). Faites juste attention au point de liaison des propriétés qui devient un underscore : la propriété monster.name est accessible via monster_name !
Il se peut que vous ayez besoin de récupérer toutes les informations du monstre d'un personnage. Dans ce cas, il est possible de spécifier simplement la propriété monster dans la méthode select() :
<?php $request = Characters::createRequest(); //On récupère le nom du premier personnage, ainsi que toutes les informations de son monstre $obj = $request->select('name, monster') ->getOnly(1) ->exec(); echo '<pre>',var_dump($obj),'</pre>'; ?>
object(stdClass)#5 (5) { ["name"]=> string(4) "Toto" ["monster_name"]=> string(5) "Medor" ["monster_life"]=> string(2) "80" ["monster_dateCreation"]=> string(10) "2012-06-01" ["monster_id"]=> string(1) "2" }
L'objet standard ainsi récupéré possède donc la propriété name contenant le nom du personnage, ainsi que chacune des propriétés
de la classe PetMonsters dont la propriété monster est une instance.
Veuillez noter que chacune de ces propriétés sont sous la forme monster_nomDeLaPropriété.
Une petite particularité : si vous ne sélectionnez qu'une propriété qui se trouve être une propriété de liaison, vous ne récupérerez pas un tableau d'objets standards mais un tableau d'instances de classe de cette propriété (ou un EntityArray selon si getOnly() a été appelée pour ne retourner qu'une valeur ou non) :
<?php $request = Characters::createRequest(); //Récupération du monstre du personnage d'id 1 $obj = $request->select('monster') ->where('id=?', array(1)) ->getOnly(1) ->exec(); echo $obj; ?>
PetMonsters Object ( [name:protected] => Medor [life:protected] => 80 [dateCreation:protected] => 2012-06-01 [id:protected] => 2 )
Bien entendu, cela fonctionne également avec les relations Many to Many !
<?php $request = Characters::createRequest(); //Récupération des objets coûtant plus de 5.00 du personnage d'id 4 $objects = $request->select('objects') ->where('id=? AND objects.price>?', array(4, 5)) ->exec(); echo '<b>Le personnage d\'id 4 possède ',count($objects)', objets coûtant plus de 5.00 :</b><br />'; foreach($objects as $obj) { echo $obj->getName(),' (',$obj->getPrice(),')<br />'; } ?>
Le personnage d'id 4 possède 3 objets coûtant plus de 5.00 : Potion de mana (6.00) Grande potion de soin (8.00) Grande potion de mana (9.00)