Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-12-2009 18:58:31

moukit233
Nouveau membre
Lieu: Temara
Date d'inscription: 08-05-2009
Messages: 4

left join

Salut,
j'ai une requtte zend:

Code:

      
       $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 :

Code:

 
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

 

#2 30-12-2009 19:34:04

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: left join

Salut,

Elle est où ta question?

Hors ligne

 

#3 30-12-2009 20:57:16

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: left join

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

Code:

       $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

 

#4 31-12-2009 09:46:56

moukit233
Nouveau membre
Lieu: Temara
Date d'inscription: 08-05-2009
Messages: 4

Re: left join

Re,
merci de votre reponse,
en fait j'ai oublie de mettre la clause where :

Code:

$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

 

#5 31-12-2009 14:44:11

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: left join

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

Code:

$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

 

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