Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je m’essaie tout doucement sur ZF 2 et je bloque un peu lors de la construction de mes requêtes sql.
Pour le départ de mon module je me suis basé sur le tuto des albums, et en gros j’essaie de modifier AlbumTable pour que le fetchAll ne renvoi que sous certaine conditions.
La requete final devrait ressembler à qqch du genre :
[lang=sql] Select * FROM Album WHERE condition1 = 1 AND (condition2 ='toto' OR condition2='tata')
Pour se faire dans AlbumTable je suis parti la dessus
[lang=php] $resultSet= $this->select(function(Select $select) use ($condition1) { $select->where(array('condition1'=>$condition1)); $select->where(array('condition2'=>'perso','condition2'=>'master'),Predicate\PredicateSet::OP_OR); });
Mais ça ne me génère pas ce que je voudrais, cela génère la requètes suivante :
[lang=sql] SELECT [Album].* FROM [Album] WHERE [condition1] = 1 OR [condition2] = 'master'
Il me bouffe un de mes prédicats, et il ne met pas de parenthèses autour de chaque prédicats (chose que faisait ZF1 je crois), et la du coup je suis un peu perdu....
Si une bonne âme peu m'indiquer où regarder je suis preneur...
Hors ligne
Salut en fait ce qu'il se passe c'est que tu fais 2 fois l'appel à where et je pense que le deuxième where écrase le premier ce qui explique pourquoi tu n'as que le deuxième. Essaie de voir si andWhere existe comme méthode et utilises celle-ci lorsque que tu dois rajouter plusieurs clauses where.
Enfin je ne peux que t'encourager à utiliser Doctrine 2 la documentation pour une utilisation "rapide et simple" est vraiment bien foutue
Hors ligne
Merci de ta réponse,
Pour Doctrine 2 je pense que je regarderai de ce coter un peu plus tard, mais en effet, ça a l'air intéressant.
Sinon pour ce qui est de mon problème immédiat, la méthode andWhere ou orWhere n'existe pas, du coup il faut passé autrement.
Voila une solution que j'ai trouvé, je sais pas si il y a plus simple ( et franchement j’espère qu'il y a plus simple...)
[lang=php] $resultSet= $this->select(function(Select $select) use ($condition1) { $select->where(array('condition1'=>$condition1)); $grp=$select->where->nest(); $grp->equalTo('condition2','tata'); $grp->__get('or'); $grp->equalTo('condition2','toto'); $grp->unnest(); });
Pour la petite explication avec nest on lui dit de créer un groupe de prédicat(d’ailleurs il renvoi un objet predicatSet) ensuite je fait ma première comparaison, avec le __get on place le prochain opérateur a OR et puis on fait la deuxièmes comparaison, et pour finir on indique la fin du groupement.
et cela produit bien le sql suivant :
[lang=sql] Select * FROM Album WHERE condition1 = 1 AND (condition2 ='toto' OR condition2='tata')
Si ça peut servir à qq'un
Hors ligne
Allez on va faire dans les bonnes pratiques ( @Orkin )
Essaie plutôt de construire cette requête :
[lang=sql] Select * FROM Album WHERE condition1 = 1 AND condition2 IN ('toto', 'tata');
Hors ligne