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 :

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, used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.