Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'écris les premières lignes d'une nouvelle application entièrement basée sur le ZF.
J'avais qques bribes d'ORM maison... et j'aimerai retrouvé/écrire (sic ?!) certaines fonctionnalités.
J'ai commencé une 'Zend_Db_Table_Row' perso que j'injecte très simplement dans mes dérivés de 'Zend_Db_Table_Abstract' via :
/** @var Classname for row */
protected $_rowClass = 'Cto_Core_Db_Table_Row';
Dans mon cas, les valeurs des colonnes 'IS_*' qui sont des NUMBER(1) sont transformés en booléen.
Je compte faire de même avec les champs DATE pour me retourner un Zend_Date.
Mon pb est néanmoins tout autre : je regarde toute les requêtes exécutées via l'excellent interface 'Zend_Db_Profiler_Firebug', et là, ô scandale, tous les INSERT sont précédés d'un 'SELECT ma_sequence.nextval from DUAL' !
Mon équivalent (mais qui ne s'occupait que d'oracle, c'est clair !) faisait un truc genre 'INSERT INTO (ID, COL1) values (ma_sequence.nextval, :COL1) returning :ID'.
Je n'ai pas trouvé d'équivalent sur le net, qqu'un aurait-il une idée ?
Merci,
Wilfried
Hors ligne
Hello,
Concernant les dates, j'ai surchargé Zend_Db_Adapter_Oracle pour réaliser un :
$this->query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
juste après la connexion. Sinon la variable NLS_DATE_FORMAT peut être paramétré dans ton environnement ainsi il n'est pas nécessaire d'exécuter cette requête.
Concernant les séquences, le but est de récupérer la valeur :
$table = new Ma_Table(); $ligne = $table->createRow($donnees); $id = $ligne->save();
$id contient la valeur courante de la séquence.
A+
Hors ligne
Bonjour,
Merci pour ces réponses rapides
Pour les dates, c'est une appli multilingue (en fait que 2, mais c'est qd même multi !), donc pas de paramétrage possible au niveau serveur. Ce n'est pas non plus au niveau connexion car un user FR qui envoie un mail à un user EN doit avoir un message correctement localisé avec notamment les formats de date qui vont bien.
Sur l'ancienne appli, j'avais un to_char() sur les dates voulues avec le format désiré. Avec le ZF, je me demande si je continue de la même manière (meilleure perfs) ou si je transforme en Zend_Date pour être plus libre ensuite...
Enfin, concernant les séquences, je comprends bien le pourquoi, ce qui ne me plait pas, c'est la réalisation avec la succession des 2 requêtes : select SEQ puis INSERT.
Pour étayer mon propos, voilà la méthode _insert() de mon ORM maison.
protected function _insert() { if (!$this->dbIsParsed(get_class($this) . '::' . __FUNCTION__ . $this->_setPk)) { $cols = $this->_getColsToInsert(); $colsInsert = $cols; $sqlCplSeq = ""; $sqlCplRet = ""; if ($this->_sqlSequence != '' && !$this->_setPk) { //--- La pk sera retournée via la séquence unset($colsInsert[$this->_sqlPkIndex]); $sqlCplSeq = "{$this->_sqlSequence}.nextval, "; $sqlCplRet = "returning {$this->_sqlPk} into :{$this->_sqlPk}"; } $colsInsert = array_map(array($this, '_formatInsertKey'), $colsInsert); $sql = "insert into {$this->_sqlTable} cols (" . implode(',', $cols) . ") values ($sqlCplSeq" . implode(',', $colsInsert) . ") $sqlCplRet"; $bl = $this->dbParse($sql); if (!$bl) { throw new DboException("Objet non inséré (parse HS)"); } foreach ($cols as $col) { switch ($this->_cols[$col]) { case self::SYSDATE : continue 2; break; } $this->dbBind($col, $this->_getColLength($col)); } } $this->dbMultiSet($this->_infos, false); $bl = $this->dbExecute(OCI_DEFAULT); if (!$bl) { throw new DboException("Objet non inséré"); } $this->offsetSet($this->_sqlPk, $this->dbGetCol($this->_sqlPk)); $this->_setPk = false; }
Ainsi, je réccupère bien la séquence en ArrayAccess et dans $id.
Voilou,
Merci
Hors ligne
Hello,
Moi aussi c'est localisé, il s'agit du format de stockage dans Oracle. Ensuite j'ai Zend_Date qui me localise le format d'affichage des dates.
Concernant les séquences, tu peux poster une issue sur le sujet (http://framework.zend.com/issues/browse/ZF) pour proposer l'évolution.
A+
Dernière modification par mikaelkael (27-01-2009 10:23:39)
Hors ligne
Arg, je pensais avoir un compte... mais je ne me souviens plus du mdp, et je ne reçois pas d'email pour le nouveau mdp... . Je le recevrai pê un peu plus tard...
Will
Hors ligne