Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je me sers régulièrement des Zend_Db_Select. Je me sers également des unions.
Je rencontre un problème que j'ai solutionné temporairement en me passant des zend_db_select.
Dans les unions le nombre de colonnes dans les requêtes est identique. Pour cela je crée des colonnes null afin de réaliser un bourage.
Je ne sais pas comment syntaxer mon zend_db_select
$select1->from(array('t1' => 'table1'),'colonne11','colonne12' ); $select2->from(array('t2' => 'table2'),'colonne21',null ); $select3->union(array($select1,$select3));
Sur mon deuxième select seul une colonne m'intéresse.
Si vous avez des idées cette syntaxe ne fonctionne pas.
Hors ligne
C'est pas un truc du genre
$select1->union($select2);
?
Hors ligne
En regardant la doc, je n'ai pas l'impression qu'on puisse faire un union avec zend_db_select.
A+, Philippe
Hors ligne
Désolé j'avais lu un peu en travers...
$select1->from(array('t1' => 'table1'), array('colonne11', 'colonne12')); $select2->from(array('t2' => 'table2'), array('colonne21', null)); $select3->union(array($select1, $select3));
normalement c'est ça, dans la doc.. from ne prend que 3 paramètres (table,champ,typeSchema)..
Bon j'espère que c'est ça
Hors ligne
j'ai trouvé ce message sur z-f :
http://www.z-f.fr/forum/viewtopic.php?id=1733
donc en fait il semblerait que ça existe, mais si on regarde dans google, ça semble assez foireux.
Quand tu dis que ça ne fonctionne pas, est-ce que tu peux nous envoyer le message d'erreur à chaque fois, ça devrait nous aider à répondre.
A+, Philippe
Hors ligne
http://framework.zend.com/apidoc/core/Z … html#union
Elle fonctionne je vous le confirme.
Hors ligne
et en codant comme ceci:
$select -> from(array('a' => 'table1)) -> joint(array('b' => 'table2'), 'a.id = b.id', array(columnb1, ...))
Hors ligne
Bon j'ai été confronté au pb aujourd'hui...
En fait quand on regarde la requête générée par le framework c'est un truc du genre
SELECT ... FROM ... UNION SELECT ... FROM ...
Ça marche très bien pour des sélect "simples"
Par contre un fois qu'on y colle des "GROUP BY" ou des choses un peu plus complexes... ça marche moins bien
il faudrait plus un truc du genre :
(SELECT ... FROM ...) UNION (SELECT ... FROM ...)
A ce moment là tout passe...
Donc pour le moment j'ai surchargé la classe Zend_Db_Select... (oui c'est mal :p) pour rajouter les parenthèses..
class MyLib_Db_Select extends Zend_Db_Select { /** * Render UNION query * * @param string $sql SQL query * @return string */ protected function _renderUnion($sql) { if ($this->_parts[self::UNION]) { $parts = count($this->_parts[self::UNION]); foreach ($this->_parts[self::UNION] as $cnt => $union) { list($target, $type) = $union; if ($target instanceof Zend_Db_Select) { $target = $target->assemble(); } $sql .= '('.$target; if ($cnt < $parts - 1) { $sql .= ') ' . $type . ' '; } } $sql.=')'; } return $sql; } }
Bon je sais pas si c'est de la que vient le problème.. ^^
Mais bon maintenant ça marche
Hors ligne
Hello,
On peut voir qu'il y a quelques soucis sur cette fonctionnalité dans le bug tracker. Toutefois il apparait plutôt qu'il s'agisse de la doc qui ne soit pas à jour, même si on peut se poser la question soulevée plus haut des parenthèses en cas de SELECT complexe et même de l'obligation (apparemment) de passer par un troisième objet Zend_Db_Select pour que cela fonctionne.
Pour résumer, il faut que ce soit un array de string, un array de Zend_Db_Select pour que cela fonctionne.
Référence :
Benjamin Eberlei a écrit:
This is mainly a documentation issue. The union() method doc comment described functionality it did not have.
The only working example for union is to pass an array of sql query strings or Zend_Db_Select instances into its first parameter and render that.
I have added documentation on the issue into the Zend_Db_Select manual.
Voici apparemment le code pour que cela fonctionne, mais je vous conseille tout de même le code de Phil dans le cas de Select compliqué :
$select1 = new Zend_Db_Select(Zend_Registry::get('db')); $select1->from('tableName1'); $select2 = new Zend_Db_Select(Zend_Registry::get('db')); $select2->from('tableName2'); $select3 = new Zend_Db_Select(Zend_Registry::get('db')); $select3->from('tableName3'); $select4 = new Zend_Db_Select(Zend_Registry::get('db')); $select4->union(array($select1,$select2,$select3)); Zend_Debug::dump($select4->__toString(),"<h1>QUERY</h1><br />");exit;
Voilà,
++
Fred
Hors ligne
Bonjour et merci pour les réponses.
Mais je n'ai toujours pas de réponses pour le nombre de colonne à maintenir à null dans 1 requête et pas dans une autre.
Je ne me suis pas pencher sur mon problème depuis quelques temps. Mais je promets de regarder cela très vite.
Sébastien.
Hors ligne