Relations Zend_Db_Table - Episode 2

Logo Zend Framework

Il y a quelques jours, j'avais écrit un article qui expliquait comment utiliser les relations Zend_Db_Table pour charger à la demande (lazy loading) les enregistrements parents d'un objet Zend_Db_Table_Row.

Mon implémentation n'était pas correcte, car j'avais d'abord choisit de stocker les parents dans des membres publics, ce qui provoquait une exception levée par la méthode magique __set de Zend_Db_Table_Row_Abstract. J'ai ensuite utilisé le tableau _data, mais ce n'est pas correct non plus car ce tableau est sérialisé lorsqu'on place l'objet dans la session. Les enregistrements parents qui sont chargés dans l'objet sont alors également sérialisés. Et cela pose problème, car il faut reconnecter chaque objet Zend_Db_Table_Row_Abstract à sa table avec la méthode setTable lors du "réveil" de l'objet.

La solution est toute simple, il suffit d'utiliser une propriété dédiée nommée _parents :

<?php
class Wiip_Db_Table_Row_Abstract extends Zend_Db_Table_Row_Abstract 
{
    
/**
     * Objets parents
     *
     * @var array
     */
    
protected $_parents = array();

    public function 
__get($columnName)
    {
        
$referenceMap $this->_table->info('referenceMap');
        if (isset(
$referenceMap[$columnName])) {
            if (!isset(
$this->_parents[$columnName])) {
               
$this->_parents[$columnName] = $this->findParentRow(
                   
$referenceMap[$columnName]['refTableClass']
               );
            }
           return 
$this->_parents[$columnName];
        }
        return 
parent::__get($columnName);
    }
}
?>

Et là, ça à l'air de marcher.

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.