Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Salut,
j'ai une requtte zend:
$maTable = new Module_Model_DbTable_MaClasse(); $select = $maTable->select(); $select->from($maTable); $select->setIntegrityCheck(false); $select = $select->joinLeft( 'table1', 'table1.ID = maTable.id',null ); $select = $select->joinLeft( 'table2', 'table2.ID = maTable.id',null); $select = $select->joinLeft( 'table3', 'table3.ID = maTable.id',null); $select = $select->joinLeft( 'table4', 'table2.id = table4.id', Null); $select = $select->joinLeft( 'table5, 'table2.id = table5.id', Null); $select = $select->group('maTable.id');
et le resultat de cette requette est :
SELECT `maTable`.* FROM `maTable` LEFT JOIN `table1` ON table1.ID = maTable.id LEFT JOIN `table2` ON table2.ID = maTable.id LEFT JOIN `table` ON table3.ID = maTable.id LEFT JOIN `table4` ON table2.id = table4.id LEFT JOIN `table5` ON table2.i = table5.id WHERE ( (table1.champs= 1 AND table1.champs2 = "test" AND table.valeur = "test@") [b]and[/b] (table1.champs = 2 AND etable1.champ = "test" AND table1.champs = "test") [b]or[/b] est qu'il y a quelqu'un peut me dire pourquoi cette requette marche pas ? merci d'avance (table1.champs = 3 AND table1.champs = "test" AND table1.champs = "test") ) GROUP BY `maTable`.`id`
esst ce qu'il y a quelqu'un peut me dire pourquoi ça marche pas ?
merci d'avance
Dernière modification par moukit233 (31-12-2009 09:16:25)
Hors ligne
Bon j'ai pas tout compris mais
j'ai l'impression qu'il te manque le where dans ton code
si tu permet je vais aussi re-formater et simplifier ton code pour y voir clair
$maTable = new Module_Model_DbTable_MaClasse(); $select = $maTable->select() ->from($maTable) ->setIntegrityCheck(false) ->joinLeft('table1', 'table1.ID = maTable.id',null) ->joinLeft('table2', 'table2.ID = maTable.id',null) ->joinLeft('table3', 'table3.ID = maTable.id',null) ->joinLeft('table4', 'table2.id = table4.id', Null) ->joinLeft('table5', 'table2.id = table5.id', Null) ->where('table1.champs= 1') ->where('table1.champs2 = "test"') ->where('table.valeur LIKE "test@"') ->where('table1.champs = 2') ->where('table1.champ = "test"') ->where('table1.champs = "test"') ->orWhere(new Zend_Db_expr('table1.champs = 3 AND table1.champs = "test" AND table1.champs = "test"')) ->group('maTable.id');
voilà de tête pour la syntaxe de la requête
mais elle ne peut rien retourner car table1.champs ne peut pas avoir plusieurs valeur en même temps donc
table1.champs= 1 AND
table1.champs2 = "test" AND
table.valeur = "test@" AND
table1.champs = 2 AND
table1.champ = "test" AND
table1.champs = "test"
tu oblige la colonne "champs" de table 1 à valoir simultanément (c'est un AND il faut donc que tout soit vrai) 1 (première ligne) 2 (quatrième ligne) et "test" (dernière ligne) aucun enregistrement ne peut avoir ces trois valeur en même temps donc ta requête est toujours vide
A+JYT
Hors ligne
Re,
merci de votre reponse,
en fait j'ai oublie de mettre la clause where :
$maTable = new Module_Model_DbTable_MaClasse(); $select = $maTable->select(); $select->from($maTable); $select->setIntegrityCheck(false); $select = $select->joinLeft( 'table1', 'table1.ID = maTable.id',null ); $select = $select->joinLeft( 'table2', 'table2.ID = maTable.id',null); $select = $select->joinLeft( 'table3', 'table3.ID = maTable.id',null); $select = $select->joinLeft( 'table4', 'table2.id = table4.id', Null); $select = $select->joinLeft( 'table5, 'table2.id = table5.id', Null); $select->where($contenuWhere); $select = $select->group('maTable.id');
$contenuWhere = ($condition and condition) or condition
$condition = (table1.champs= 1 AND table1.champs2 = "test" AND table.valeur = "test@") avec des valeur des champs differentes
Hors ligne
il est inutile de faire de multiple affectation à $select
ça sert à rien et ça fait des opérations mémoire pour rien
je te conseille d'utiliser Zend_Db_Expr pour écrire ta condition si elle est complexe.
enfin pense à utiliser les méthodes Zend_Db pour mettre bien au propre ta requête
pour finir je préfère utilise des paramètres nommés ça simplifie la relecture
et ça permet d'éxécuter la requête dans un outils SQL en changeant les valeur sans avoir à modifier la requête
$select ->from('USR', array( $this->_db->quoteIdentifier('mail') => 'USR_MAIL', $this->_db->quoteIdentifier('name') => 'USR_NAME', $this->_db->quoteIdentifier('firstname') => 'USR_FIRSTNAME' )) ->where('USR_ID = :id') ; $statement = $this->_db->prepare($select); $statement->setFetchMode(Zend_Db::FETCH_OBJ); $statement->execute(array('id' => $id));
les méthode comme quoteIdentifier te garentissent d'être compatible avec ton moteur et ce même si tu en change
prepare créer un statement avec ta requête tu peux ensuite l'exécuter plusieurs fois avec différente valeur
setFetchMode permet de retourner un objet à la place d'un tableau associatif
execute exécute la requête il y a aussi fetch et fetchall etc. le paramètre est un tableau associatif des différentes valeurs à passer au statement pour l'exécution.
le fait d'utiliser des paramètres nommés permet d'y voir clair quand l'exécution est loin de la définition de la requête
A+JYT
Hors ligne