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.

Ajouter un commentaire