Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-12-2010 09:12:53

Hall
Membre
Date d'inscription: 23-08-2010
Messages: 54

Zend_db + order by case

Bonjour,
Voilà la requête que j'aimerai faire avec Zend_db:

Code:

SELECT `P`.*, `C`.*, `Cl`.*, `Ag`.*, `V`.*, `Dpt`.*, `R`.*, `pa`.*, `F`.*, `E`.*, `Exp`.*, `S`.* 
FROM `postes` AS `P` 
LEFT JOIN `contrats` AS `C` ON P.poste_contrat = C.contrat_id 
LEFT JOIN `clients` AS `Cl` ON P.cli_id = Cl.cli_id 
LEFT JOIN `agences` AS `Ag` ON P.agence_id = Ag.agence_id 
LEFT JOIN `villes` AS `V` ON (P.ville_id = V.ville_id) 
LEFT JOIN `departements` AS `Dpt` ON (P.poste_dpt = Dpt.dpt_id) 
LEFT JOIN `regions` AS `R` ON (P.poste_region = R.region_id) 
LEFT JOIN `pays` AS `pa` ON (P.poste_pays = pa.pays_iso_number) 
LEFT JOIN `fonctions` AS `F` ON P.poste_fonction = F.fonction_id 
LEFT JOIN `etude` AS `E` ON P.poste_etude = E.etude_id 
LEFT JOIN `postes_exp` AS `Exp` ON P.poste_experience = Exp.postes_exp_id 
LEFT JOIN `secteurs` AS `S` ON P.poste_secteur = S.secteur_id 
WHERE ((poste_intitule LIKE '%secretaire medicale%' OR poste_intitule LIKE '%secretaire%' OR poste_intitule LIKE '%medicale%' ) 
OR (poste_description LIKE '%secretaire medicale%' OR poste_description LIKE '%secretaire%' OR poste_description LIKE '%medicale%' ) 
OR (agence_rs LIKE '%secretaire medicale%' OR agence_rs LIKE '%secretaire%' OR agence_rs LIKE '%medicale%' ) 
OR (cli_rs LIKE '%secretaire medicale%' OR cli_rs LIKE '%secretaire%' OR cli_rs LIKE '%medicale%')) 
ORDER BY case when poste_intitule LIKE '%secretaire medicale%' then 1 else 2 end,`poste_date_update` DESC

Tout fonctionne sauf l'order by case

Voici le code de l'order by case:

Code:

 $tri='case when poste_intitule LIKE %'.$criteria['keys'].'% then 1 else 2 end';
 $select->order(array($tri, $order['sort'] . " " . $order['dir']));

Voici le message d'erreur que j'ai à l'exécution, l'order by case ne fonctionne pas:

Code:

Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'case when poste_intitule LIKE %secretaire medicale% then 1 else 2 end' in 'order clause'

Merci d'avance pour votre aide!

Hors ligne

 

#2 09-12-2010 09:48:03

Greg
Membre
Lieu: Haute loire
Date d'inscription: 14-11-2007
Messages: 24

Re: Zend_db + order by case

Ton $tri ne devrait pas être un Zend_Db_Expr?

Code:

 $tri = new Zend_Db_Expr($db->quoteInto('case when poste_intitule LIKE %?% then 1 else 2 end', $criteria['keys']));
 $select->order(array($tri, $order['sort'] . " " . $order['dir']));

Pour le debug, un objet Zend_Db_Select se caste en chaine automatiquement et te permet de voir la requête simplement :

Code:

var_dump($select.'');

Hors ligne

 

#3 09-12-2010 10:33:04

Hall
Membre
Date d'inscription: 23-08-2010
Messages: 54

Re: Zend_db + order by case

Merci Greg!
J'ai corrigé en mettant ça:

Code:

 $tri="(case when poste_intitule LIKE '%".$criteria['keys']."%' then 1 else 2 end)";
                for($i=0;$i<sizeof($keys);$i++) {
                    $tri .= ",(case when poste_intitule LIKE '%".$keys[$i]."%' then 1 else 2 end)";
        }
               
$select->order($tri . "," . $order['sort'] . " " . $order['dir']);

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