2009-12-12 8 views
1

J'utilise les classes Zend_Db_Table de Zend Framework pour extraire des données d'une base de données. Je voudrais "affiner" chaque ligne que je récupère d'une table en y ajoutant quelque chose. Dans une simple requête SQL, j'écrirais par exemple. SELECT *, dueDate<NOW() AS isOverdue. Dans cet exemple, il est possible d'ajouter un champ supplémentaire à la requête SQL, mais il peut parfois être plus approprié de faire des choses supplémentaires avec PHP. Quoi qu'il en soit, j'utiliserais cette information principalement dans mes opinions, par exemple. mettre en évidence les articles en retard en conséquence.Comment ajouter des données aux lignes db récupérées avec ZF?

Quel serait un bon endroit pour ajouter ces données isOverdue dans une application ZF? Mes pensées à ce jour:

  • constatant que ZF dispose d'un mécanisme intégré pour cela (sans succès jusqu'à présent)
  • subclassing Zend_Db_Table_Row
  • remplaçant _fetch() dans ma Zend_Db_Table classe
  • faut se demander si ce est un modèle sain d'esprit :)

En prime, ce serait bien que je puisse encore utiliser ZF pour mettre à jour les lignes. Peut-être que ce serait (une autre) raison pour une convention de nommage pour les champs personnalisés?

Répondre

2

Pourquoi réinventer la roue? Il y a une fonctionnalité intégrée pour ce faire:

$this->select()->from('your_table_name_here', array('*', 'dueDate<NOW() AS isOverdue')); 

Il suffit de spécifier les colonnes dont vous avez besoin en utilisant le deuxième paramètre de de la fonction() et il va générer le SQL que vous avez besoin (par défaut, si vous n'utilisez pas second paramètre, il génère une requête "SELECT * FROM table").


PavelDubinin.com - Professional Web Development blog

+0

Merci. Cette solution est un bon début, mais elle a quelques inconvénients. Du point de vue de l'appelant, ce serait génial si ma classe Zend_Db_Table "fonctionne". L'appelant pourrait appeler par exemple. $ Table-> fetchAll() ou $ Table-> find (...) et obtient toujours le champ isOverdue. C'est pourquoi j'aimerais le faire au niveau de la ligne. Deuxièmement, cela ne fonctionne que si les données supplémentaires peuvent être exprimées avec SQL. Ce n'est peut-être pas toujours le cas. – tuomassalo

+0

Je comprends ce que vous voulez dire, mais je crois que vous essayez de résoudre le problème du mauvais point de vue. Bien que tenter de "pirater" les résultats au niveau de la base de données peut sembler une bonne idée, en réalité, il va vite se transformer en problèmes et en bogues qui sont difficiles à trouver. Pourquoi ne pas simplement créer une classe que vous utiliserez pour préparer les données comme vous le souhaitez et ensuite utiliser cette classe sur votre contrôleur? C'est une approche MVC normale et je ferais certainement de cette façon moi-même. –

+0

Vous pouvez également utiliser des lignes de table: http://framework.zend.com/manual/en/zend.db.table.row.html Vous créez une classe dérivée de Zend_Db_Table_Row_Abstract et l'affectez à la table en définissant ses Propriété $ _rowClass. Ensuite, chaque fois que vous récupérez la ligne, cette classe sera récupérée et vous pourrez appeler ses méthodes. Je ne suis pas un grand fan d'une telle "magie" –

Questions connexes