Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/12/2010, 22h21   #1
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Par défaut Zend_DB_Table_Select : jointure externe

Bonjour,
J'essaie une requête avec pas mal de jointures dans une méthode d'une Zend_Db_Table_Abstract :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Application_Model_DbTable_Etudiant extends Zend_Db_Table_Abstract
{
 
    protected $_name = 'th_etudiant_etu';
    protected $_primary = 'etu_id_candidat';
 
    /**
     * inscritStage(String $login)
     * Donne le stage auquel est éventuellement inscrit l'étudiant
     * @param String $login : Identifiant de l'étudiant connecté
     * @return Zend_Db_Table_Row_Abstract : Le stage ou NULL
     */
    public function inscritStage($login)
    {
        /* $select correspond à la requête SQL ci-dessous :
              SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin,
                  e.etb_nom, c.cmn_nom, d.dpt_numero
            FROM th_utilisateur_uti AS u
            LEFT OUTER JOIN tj_cnd_inscrire_ssn_cis AS cis ON cis_id_candidat = u.uti_id_personne
                  LEFT OUTER JOIN te_session_ssn AS ssn ON ssn.ssn_id = cis.cis_id_session
                    INNER JOIN th_stage_stg AS stg ON stg.stg_id_session = ssn.ssn_id
                          INNER JOIN te_etablissement_etb AS e ON e.etb_id = stg.stg_id_etablissement
                            INNER JOIN tr_commune_cmn AS c ON c.cmn_id = e.etb_id_commune
                                  INNER JOIN tr_departement_dpt AS d ON d.dpt_id = c.cmn_id_departement
            WHERE u.uti_login = '$login'
         */
 
        $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
        $select->setIntegrityCheck(false);
        $select->from(array('etu'=>$this->_name));
        $select->join(array('uti'=>'th_utilisateur_uti'), 'uti.uti_id_personne = etu.etu_id_candidat');
        $select->joinLeft(array('cis'=>'tj_cnd_inscrire_cis'), 'cis.cis_id_candidat = etu.etu_id_candidat');
        $select->joinLeft(    array('ssn'=>'te_session_ssn'), 'ssn.ssn_id = cis.cis_id_session',
                            array('ssn_id', 'ssn_libelle', 'ssn_date_debut', 'ssn_date_fin')
                        );
        $select->join(array('stg'=>'th_stage_stg'), 'stg.stg_id_session = ssn.ssn_id');
        $select->join(array('etb'=>'te_etablissement_etb'), 'etb.etb_id = stg.stg_id_etablissement', 'etb_nom');
        $select->join(array('c'=>'tr_commune_cmn'), 'c.cmn_id = etb.etb_id_commune', 'cmn_nom');
        $select->join(array('d'=>'tr_departement_dpt'), 'd.dpt_id = c.cmn_id_departement', 'dpt_numero');
        $select->where('uti.uti_login = ?', $login);
 
        return $this->fetchRow($select);
    }
}
D'après mes tests, ça coince à la première jointure externe joinLeft.

On ne peut pas faire de jointure externe de cette façon ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 11h07   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Je suis passé par la requête SQL native, c'est beaucoup plus simple !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public function inscritStage($login)
    {
        $select = "
            SELECT ssn.ssn_id, ssn.ssn_libelle, ssn.ssn_date_debut, ssn.ssn_date_fin,
                  e.etb_nom, c.cmn_nom, d.dpt_numero
            FROM th_utilisateur_uti AS u
            LEFT OUTER JOIN tj_cnd_inscrire_ssn_cis AS cis ON cis_id_candidat = u.uti_id_personne
                  LEFT OUTER JOIN te_session_ssn AS ssn ON ssn.ssn_id = cis.cis_id_session
                    INNER JOIN th_stage_stg AS stg ON stg.stg_id_session = ssn.ssn_id
                          INNER JOIN te_etablissement_etb AS e ON e.etb_id = stg.stg_id_etablissement
                            INNER JOIN tr_commune_cmn AS c ON c.cmn_id = e.etb_id_commune
                                  INNER JOIN tr_departement_dpt AS d ON d.dpt_id = c.cmn_id_departement
            WHERE u.uti_login = ?
        ";
 
        return $this->_db->fetchRow($select, $login);
    }
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h17.


 
 
 
 
Partenaires

Hébergement Web