Zend_Db_Table_RowsetIntroductionLorsque vous effectuez une requête avec une classe de Table en utilisant find() ou fetchAll() , le résultat retourné est alors un objet de type Zend_Db_Table_Rowset_Abstract. Un Rowset est un conteneur d'objets descendants de Zend_Db_Table_Row_Abstract. Vous pouvez itérer à travers ce conteneur et accéder aux objet Row individuellement, en lecture ou écriture bien entendu. Récupérer un RowsetZend_Db_Table_Abstract possède des méthodes find() et fetchAll(), chacune retourne un objet de type Zend_Db_Table_Rowset_Abstract. Example #1 Exemple de récupération d'un rowset
Atteindre les Rows depuis un RowsetL'objet Rowset en lui-même n'est pas très intéressant au regard des objets Rows qu'il contient, qui eux, le sont bien plus.
Un requête légitime peut retourner zéro enregistrement, donc zéro Rows. De ce
fait, un objet Rowset peut contenir zéro objet Row. Comme
Zend_Db_Table_Rowset_Abstract implémente l'interface
Example #2 Compter les Rows dans un Rowset Example #3 Lecture d'un simple Row depuis un Rowset La façon la plus simple d'accéder à un Row depuis l'objet Rowset est d'utiliser la méthode current(). C'est tout à fait adapté lorsque le Rowset ne contient qu'un résultat (Row).
Si le Rowset ne contient aucun Row, current() retourne NULL. Example #4 Itération à travers un Rowset
Les objets descendants de Zend_Db_Table_Rowset_Abstract
implémentent l'interface
Example #5 Déplacement vers une position précise dans le Rowset
getRow() permet de retourner directement un enregistrement en fonction de sa position dans l'itérateur Rowset. Le premier paramètre est un entier représentant cette position. Le second paramètre est optionnel, et indique si oui ou non l'itérateur doit rester sur cette position, après avoir retourné le Row correspondant. Par défaut, il est à FALSE. Cette méthode retourne donc un objet Zend_Db_Table_Row. Si la position demandée n'existe pas, une exception est levée :
Dès que vous avez accès à un objet individuel Row, vous pouvez le piloter comme présenté dans la section Zend_Db_Table_Row. Récupérer un Rowset en tant que tableau (Array)Vous pouvez accéder à toutes les données d'un Rowset au moyen d'un tableau PHP avec la méthode toArray(). Ce tableau possède deux dimensions. Chaque entrée du tableau représente un tableau de l'objet Row. Les clés sont les noms des champs, et les valeurs leurs valeurs. Example #6 Utiliser toArray() Le tableau retourné par toArray() n'est pas une référence. Le modifier ne modifiera en aucun cas les données réelles dans la base de données. Sérialisation et Désérialisation d'un RowsetLes objets de type Zend_Db_Table_Rowset_Abstract sont sérialisables. De la même manière que vous sérialisez un objet Row individuel, le Rowset est sérialisable et désérialisable. Example #7 Sérialiser d'un Rowset Utilisez simplement la fonction PHP serialize() pour créer une chaîne de caractères représentant votre objet Rowset.
Example #8 Désérialisation d'un objet Rowset sérialisé Utilisez simplement la fonction PHP unserialize(). Notez que l'objet retourné fonctionne alors en mode déconnecté. Vous pouvez itérer à travers, et lire les objets Row qu'il contient, mais vous ne pouvez plus faire intervenir la base de données, ni changer de valeurs dans les Rows.
Il est bien entendu possible de reconnecter l'objet Rowset à la base de données, et plus précisément à la Table dont il fut issu. Utilisez la méthode setTable() et passez lui une instance héritant de Zend_Db_Table_Abstract. Une fois reconnecté, l'objet Rowset possède de nouveau un accès à la base de données, et n'est donc plus en mode lecture seule. Example #9 Réactivation d'un Rowset
Réactiver un Rowset avec setTable() réactive tous les Rows le composant. Étendre la classe RowsetVous pouvez utilisez votre propre classe étendant Zend_Db_Table_Rowset_Abstract. Spécifiez votre classe dans la propriété protégée $_rowsetClass de la classe de votre Table, ou dans le tableau du constructeur de l'objet Table. Example #10 Spécifier sa propre classe de Rowset
En temps normal, la classe standard Zend_Db_Rowset est suffisante. Cependant, il peut être judicieux de rajouter de la logique dans son Rowset, pour une table précise. Par exemple, une nouvelle méthode pourrait effectuer des calculs. Example #11 Exemple d'une classe Rowset personnalisée avec une nouvelle méthode
|