Astuce symfony : ne pas charger une colonne lors de “l’hydratation” d’un objet

9 décembre 2007 par Olivier Mansour

En fait c’est plutôt une astuce Propel ;-).

Quand vous chargez des données depuis la base (avec doSelect ou retrieveByPk) vous récupérez des objets complètement “hydratés”. C’est à dire que chaque objet représente une ligne de votre base de donnée avec autant de variables membres que de colonnes. Un problème évident peut survenir si votre table contient des champs lourds à charger comme des binaires (BLOB) si vous voulez stocker des images, ou des chaines très longues (CLOB) pour du XML par exemple. C’est autant de données qu’il faudra extraire et charger dans vos objets ; autant vous dire que ce n’est pas forcément anodin en terme de performance (et je parle d’expérience).

Une solution simple existe pour contourner ce soucis. Dans le fichier décrivant vos données (schema.yml) ajouter simplement lazyLoad: true dans la description de la colonne que vous ne désirez pas charger.

matable:
  id:
    type: INTEGER
    required: true
    autoIncrement: true
    primaryKey: true
  smallcol:
    type: VARCHAR
    size: 255
  bigcol:
    type: CLOB
    lazyLoad: true

Avec cette configuration, si je fais : MatablePeer::retrieveByPk(1), j’aurais un objet contenant uniquement les champs id et smallcol. Par contre, quand, sur mon objet, je ferais un ->getBigCol(), Propel lancera une requête (en fait un doSelectRS sur le champs en question) et récupèrera notre donnée.

Astucieux non ?

Pour soutenir ce site, n'hésitez pas à cliquer sur un de ces liens :

  1. Par NiKo le 9 décembre 2007 | Répondre

    Wow, je savais pas qu’on pouvait gérer ça dans le schema.yml. C’est très astucieux, en effet :)

  2. Par Hugo le 15 janvier 2008 | Répondre

    Très bon à savoir ! Merci pour l’information :)

Commentaires

RSS des commentaires pour ce post