Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-01-2013 20:25:00

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Bonsoir,
Avant de laisser tomber, je viens vers vous pour voir si vous pourriez m'aiguiller.
Je suis en train de recoder un site et le passer sous ZF2, et je bute sur une requete :

SELECT id,precision_annexe,ville,code_postal FROM liste_ville WHERE LCASE(ville) LIKE "maville%" OR LCASE(precision_annexe) LIKE "maville%" ORDER BY vue desc LIMIT 0,10
Une petite requete de rien du tout, mais pas moyen de la transcrire en Zend\Db\Sql\Sql .

Ma veine tentative :
http://pastebin.com/ysBFtrEP
Et la requete résultante :
SELECT "ville"."id" AS "id", "ville"."precision_annexe" AS "precision_annexe", "ville"."nom" AS "nom", "ville"."code_postal" AS "code_postal" FROM "ville" WHERE  LIKE 'maville%' AND "lcase""(""precision_annexe"")" LIKE 'maville%' ORDER BY "vue" DESC LIMIT '5'

Mais rien que la premier partie de la requete, du select au from ( en enlevant le where ), est incorrecte.
Le "or" ne passe pas, le lcase ne passe pas non plus, ...

Alors soit j'abandonne le Zend\Db\Sql\Sql pour écrire mes requetes en SQL, soit je passe sur Doctrine ( mais apprendre Zf 2 + Doctrine ca fait beaucoup d'un coup ), soit je persévère avec Zend\Db\Sql\Sql qui m'a l'air dur pour pas grand chose.

Merci de m'avoir lu wink

Hors ligne

 

#2 24-01-2013 09:12:47

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Salut, je n'utilise pas Zend\Db\Sql\Sql mais j'utilise Doctrine et j'ai commencé ZF2 avec doctrine justement la difficulté n'est pas beaucoup plus importante surtout que maintenant il y a de la documentation pour DoctrineModule et DoctrineORMModule (dans le dossier documentation sur github) et franchement tout est expliqué. Il reste le DQL et la création des entités et là encore il y a de la documentation (je la trouve moins clair mais suffit largement pour "commencer").

Hors ligne

 

#3 24-01-2013 11:14:56

Juch
Membre
Lieu: Paris 17e
Date d'inscription: 29-04-2009
Messages: 48

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Salut j'écris ça vite fait sans tester mais tente plutôt ça.

Code:

[lang=php]
use Zend\Db\Sql\Expression;
 if(preg_match('#^.*? .*?$#is',$nom)){
            $nom = str_replace(' ','-',$nom);
}
$select = $this->sql->select('liste_ville');
        $select->columns(array('id', 'precision_annexe', 'ville', 'code_postal'))
            ->where
               ->like(new Expression('LCASE(ville)'), $nom . '%')
               ->or
               ->like(new Expression('LCASE(precision_annexe)'), $nom . '%');
           ->order(array('vue DESC'))
           ->limit(10)
           ->offset(10);

Hors ligne

 

#4 24-01-2013 15:10:15

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Ca marche mieux ^^




Ton code modifié :

Code:

[lang=php]
$select = $this->sql->select('ville');
        $select->columns(array('id', 'precision_annexe', 'nom', 'code_postal'),false)
            ->where
               ->like(new Expression('LCASE(nom)'), $nom . '%')
                   ->or
               ->like(new Expression('LCASE(precision_annexe)'), $nom . '%');
       $select->order(array('vue DESC'))
              ->limit(10)
              ->offset(10);

Et ce que j'ai pour l'instant :

Code:

[lang=sql]
SELECT "id" AS "id", "precision_annexe" AS "precision_annexe", "nom" AS "nom", "code_postal" AS "code_postal" 
FROM "ville" 
WHERE  LIKE 'dcdzahsdf%' 
OR  LIKE 'dcdzahsdf%' 
ORDER BY "vue" 
DESC LIMIT '10' 
OFFSET '10'

Ce qui est attendu ( testé via phpMyAdmin ):

Code:

[lang=sql]
SELECT "id" AS "id", "precision_annexe" AS "precision_annexe", "nom" AS "nom", "code_postal" AS "code_postal" 
FROM ville 
WHERE LCASE(nom) LIKE 'dcdzahsdf%' 
OR LCASE(precision_annexe) LIKE 'dcdzahsdf%' 
ORDER BY "vue" 
DESC LIMIT 10 
OFFSET 10

Donc :
Le lcase ne passe pas
Les doubles quotes autour du nom de la ville de passent pas ( mais sur phpMyAdmin, peut etre qu'il veut bien quand c'est Zend ... ? )

Hors ligne

 

#5 24-01-2013 15:33:06

Juch
Membre
Lieu: Paris 17e
Date d'inscription: 29-04-2009
Messages: 48

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Apparemment il n'arrive pas à reconnaître ton expression comme un champ de la table et donc il fait l'impasse dessus, peut-être en lui précisant de cette manière que c'est bien de type identifier.
Attention c'est expérimental, je ne suis pas responsable du résultat big_smile

Code:

[lang=php]
->like(new Expression('LCASE(?)', array('nom'), array(Expression::TYPE_IDENTIFIER)), $nom . '%')

Dernière modification par Juch (24-01-2013 15:33:21)

Hors ligne

 

#6 24-01-2013 15:52:32

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Nop, ca ne s'affiche toujours pas. Voici les erreurs qui me sont renvoyé :

Code:

[lang=php]
<br />
<b>Warning</b>:  preg_split() expects parameter 2 to be string, object given in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>121</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>123</b><br />
<br />
<b>Warning</b>:  implode() [<a href='function.implode'>function.implode</a>]: Invalid arguments passed in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>142</b><br />
<br />
<b>Warning</b>:  preg_split() expects parameter 2 to be string, object given in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>121</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>123</b><br />
<br />
<b>Warning</b>:  implode() [<a href='function.implode'>function.implode</a>]: Invalid arguments passed in <b>J:\xampp\htdocs\vieassoc\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php</b> on line <b>142</b><br />

C'est le moment ou je me dis que passer à doctrine est une vrai éventualité. De plus, dans la série " localisation avec les villes", j'ai un méga calcul dans une requete :

Code:

$formule="(6366*acos(cos(radians($latitude))*cos(radians(`latitude`))*cos(radians(`longitude`) -radians($longitude))+sin(radians($latitude))*sin(radians(`latitude`))))";

Si je galere avec un lcase, je vais pas passer des heures à juste traduire une requete deja toute faite...

Hors ligne

 

#7 24-01-2013 17:25:24

Juch
Membre
Lieu: Paris 17e
Date d'inscription: 29-04-2009
Messages: 48

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

J'ai bien une idée crade car je n'ai pas ZF2 sous la main la donc je ne peux pas faire de tests.

Code:

->where("LCASE(nom) LIKE '$nom%' OR LCASE(precision_annexe) LIKE '$nom%'");

En attendant que qq'un te donne une solution acceptable

Hors ligne

 

#8 25-01-2013 11:04:49

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Pourquoi tu utilise pas une fonction php au lieu de lcase?

Sinon utilise direct le query comme ça :
//transforme le select en string (pour pas que zf2 l'interprete)
$selectString = $sql->getSqlStringForSqlObject($select);
//utilisation du adapteur->query pour executer directement la requete string
$rowset = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);

Je ne sais pas si cela marche mais comme ya pas longtemps j'ai lu la doc de zend/sql , je crois avoir vu cela.

Mais perso, j'aurais utiliser la fonction PHP faite pour ça

smile

Dernière modification par Nirzol (25-01-2013 11:06:48)

Hors ligne

 

#9 25-01-2013 14:45:08

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Nirzol a écrit:

Pourquoi tu utilise pas une fonction php au lieu de lcase?
[....]
Mais perso, j'aurais utiliser la fonction PHP faite pour ça

Nop, c'est pas possible : je fais un lcase sur le champs de la table, pas sur un variable ...

Hors ligne

 

#10 28-01-2013 04:18:53

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

ok autant pour moi smile

Hors ligne

 

#11 28-01-2013 13:06:57

Juch
Membre
Lieu: Paris 17e
Date d'inscription: 29-04-2009
Messages: 48

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

résolu ?

Hors ligne

 

#12 28-01-2013 23:15:41

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Trop de travail pour m'y pencher dessus. Je passerai à doctrine quand je me remettrais à ZF, mais j'ai du mal à supporter l'idée de mettre la journée pour faire une requete SQL avec Zend\Db\Sql\Sql alors que j'ai deja la requete sous les yeux.

Hors ligne

 

#13 05-03-2013 12:26:34

KevOne
Nouveau membre
Date d'inscription: 09-11-2011
Messages: 2

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Bonjour,

J'ai rencontré un problème relativement similaire.

Je l'ai résolu de la manière suivante :

Code:

$sqlString = $sql->prepareStatementForSqlObject($select);
$result = $sqlString->execute()->current();

En espérant que ça vous aide.

Hors ligne

 

#14 05-03-2013 19:58:05

serutan
Membre
Date d'inscription: 23-01-2013
Messages: 15

Re: ZF2 - Création d'une requete avec Zend\Db\Sql\Sql

Bonsoir,
En me résignant à ne pas utiliser le Zend\Db\Sql\Sql pour creer mes requetes SQL, tout va pour le mieux.
En gros, voici ce que donne une requete ( ton code ne permet pas d'avoir un tableau de résultat, alors tant qu'a conclure ce sujet avec quelque chose pour les débutants, autant que ce soit optimal wink ! )

Code:

public function getSousCategorie($id){
        $sql = 'SELECT id, libelle FROM une_table WHERE id = ?';
        $result = $this->adapter->query($sql)->execute(array($id));
        $return = array();
        $lengthResult = $result->count();
        for($i=0; $i<$lengthResult; $i++){
            $return[] = $result->current();
            $result->next();
        }
        return $return;
    }

Dernière modification par serutan (05-03-2013 20:01:49)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages