IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Résultat de requête avec join


Sujet :

Zend_Db PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Résultat de requête avec join
    Bonjour,

    Je souhaite réaliser la requête sql ci-dessous (elle fonctionne bien, testé sur phpmyadmin):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT datecom, textcom, titrecom, login
    FROM commentaires, compte
    WHERE compte.idcompte = commentaires.compte_idcompte
    AND commentaires.com_idarticles = ".$id
    Lorsque j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Commentaires extends Zend_Db_Table_Abstract
    {
    	protected $_name = 'commentaires';
     
    	protected $_dependentTables = array("Compte");
     
    	protected $_referenceMap = array
    	(
        'Related' => array
    	(
        'columns' => array('compte_idcompte'),
        'refTableClass' => 'Compte',
        'refColumns' => 'idcompte'
    	)
    	);
     
    public function getCom($id)
    	{
    		$select = $this->select()
    						->from(array('com'=>$this->_name), array('datecom', 'titrecom', 'textcom'))
    						->join(array('compt'=>'compte'), 'compt.idcompte = com.compte_idcompte', 'login')
    						->where('com.com_idarticles = ?', $id)
    						->order('com.datecom desc')
    						->setIntegrityCheck(false);
     
    		return $this->getAdapter()->fetchAll($select);
    	}
    je peux récupérer les éléments de ma table COMMENTAIRES mais pas le "login" de ma table COMPTE...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<?php foreach($this->commentaires as $commentaire) : ?>
     
    		<tr><h5>Publié le <?php echo $this->escape($this->convertdate($commentaire['datecom']));?> par <?php $this->escape($commentaire['login']);?></h5></tr>
    		<tr><h4><?php echo $this->escape($commentaire['titrecom']);?></h4></tr>
    		<tr><h5><?php echo $this->paragraph($commentaire['textcom']);?></h5></tr>
    pourtant avec Zend_Debug::dump($this->getAdapter()->fetchAll($select)) je récupère bien ["login"]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    array(1) {
      [0] => array(4) {
        ["datecom"] => string(19) "2011-11-16 16:37:58"
        ["titrecom"] => string(5) "titre"
        ["textcom"] => string(11) "commentaire"
        ["login"] => string(7) "julienP"
      }
    }
    Merci pour votre aide...

  2. #2
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    essaye array('login') à la place de 'login'

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par 5h4rk Voir le message
    essaye array('login') à la place de 'login'
    merci de ta réponse,

    je viens d'essayer mais ça ne change rien...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Écris la requête en SQL natif (et avec la syntaxe en vigueur depuis 1992 pour les jointures) et ne t'embête pas avec le pseudo SQL inutilement compliqué de ces saloperies d'ORM !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "
    	SELECT t1.datecom, t1.textcom, t1.titrecom, t2.login
    	FROM commentaires t1
    	INNER JOIN compte t2 ON t2.idcompte = t1.compte_id_compte
    	WHERE t1.com_idArticle = :id_article
    ";
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    Et perds la traitement des données fais par Zend. Et Zend_Db n est pas vraiment un ORM

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Voilà un exemple de ce qu'il est possible de faire avec Zend Framework et des requêtes en SQL natif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    class Application_Model_DbTable_Etudiant extends Zend_Db_Table_Abstract
    {
     
        protected $_name = 'th_etudiant_etu';
        protected $_primary = 'etu_id_candidat';
     
        /**
         * Récupère toutes les infos relatives à un étudiant
         * @param Integer $iduser : Identifiant de l'étudiant
         */
        public function infosEtudiant($iduser)
        {
        	$sql = "
        		SELECT p.prs_nom, p.prs_prenom, p.prs_adrel, p.prs_telephone, 
    				e.etu_date_naissance, e.etu_adresse, e.etu_code_postal, 
    				c.cmn_id AS id_commune_residence, 
    				c.cmn_nom AS commune_residence, 
    				etb.etb_id, etb.etb_nom, etb.etb_adresse, etb.etb_code_postal, etb.etb_telephone, 
    				c1.cmn_id AS id_commune_etablissement, 
    				c1.cmn_nom AS nom_commune_etablissement, 
    				c1.cmn_nom AS commune_etablissement, 
    				te.te_id, te.te_libelle, 
    				ccr.ccr_libelle,
    				dsc.dsc_nom
    			FROM th_etudiant_etu AS e 
    				INNER JOIN te_personne_prs AS p ON p.prs_id = e.etu_id_candidat 
    			INNER JOIN te_concours_ccr AS ccr ON ccr.ccr_id = e.etu_id_concours 
    				INNER JOIN te_discipline_dsc AS dsc ON dsc.dsc_id = ccr.ccr_id_discipline 
    			LEFT OUTER JOIN tr_commune_cmn AS c ON c.cmn_id = e.etu_id_commune_residence 
    			LEFT OUTER JOIN te_etablissement_etb As etb ON etb.etb_id = e.etu_id_etablissement_origine 
    				LEFT OUTER JOIN tr_commune_cmn AS c1 ON c1.cmn_id = etb.etb_id_commune 
    				LEFT OUTER JOIN tr_type_etablissement_te AS te ON te.te_id = etb.etb_id_type_etablissement
    			WHERE e.etu_id_candidat = ? 
    		";
        	return $this->_db->fetchRow($sql, (int) $iduser);
        } // Fin public function infosEtudiant($login)
     
        /**
         * Donne le stage auquel est éventuellement inscrit l'étudiant
         * @param String $iduser : Identifiant de l'étudiant connecté
         * @return Zend_Db_Table_Row_Abstract : Le stage ou NULL
         */
        public function inscritStage($iduser)
        {
        	$sql = "
        		SELECT p.prs_nom, p.prs_prenom,
        			ssn.ssn_id, ssn_code, ssn.ssn_libelle, 
        			DATE_FORMAT(ssn.ssn_date_debut, '%d/%m/%Y') AS ssn_date_debut, 
        			DATE_FORMAT(ssn.ssn_date_fin, '%d/%m/%Y') AS ssn_date_fin,
      				e.etb_nom, c.cmn_nom, d.dpt_numero
    			FROM te_personne_prs AS p 
    			LEFT OUTER JOIN tj_cnd_inscrire_ssn_cis AS cis ON cis_id_candidat = p.prs_id
      				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 p.prs_id = ?
    		";
     
        	return $this->_db->fetchRow($sql, (int) $iduser);
        } // Fin public function inscritStage($login)
     
        /**
         * Vérifie si un étudiant existe dans la BDD
         * @param String $nom
         * @param String $prenom
         * @param Date $datenaissance
         */
        public function identifierEtudiant($nom, $prenom, $datenaissance)
        {
        	$sql = "
        		SELECT u.uti_login 
        		FROM th_etudiant_etu AS e 
        		INNER JOIN th_utilisateur_uti AS u ON u.uti_id_personne = e.etu_id_candidat 
        			INNER JOIN te_personne_prs AS p ON p.prs_id = u.uti_id_personne 
        		WHERE p.prs_nom = :nom 
        			AND p.prs_prenom = :prenom 
        			AND e.etu_date_naissance = :datenaissance 
        	";
        	return $this->_db->fetchRow($sql, 
        		array(	'nom'=>$nom, 
        				'prenom'=>$prenom, 
        				'datenaissance'=>$datenaissance
        			)
        	);
        } // Fin public function identifierEtudiant($nom, $prenom, $datenaissance)
     
        /**
         * Inscrit un étudiant à un stage
         * @param Integer $iduser : Identifiant de l'étudiant
         * @param integer $idsession : Identifiant de la session de stage
         */
        public function inscrire($iduser, $idsession)
        {
        	$sql = "
        		INSERT INTO tj_cnd_inscrire_ssn_cis (cis_id_candidat, cis_id_session) 
        		VALUES 
        		(
        			:iduser, 
        			:session 
        		)
        	";
     
        	$stmt = $this->_db->query($sql, array(	'iduser' => (int) $iduser,
        											'session' => (int) $idsession
        										)
        							);
        }
     
        /**
         * Supprime l'inscription d'un étudiant à un stage
         * @param $iduser : Identifiant de l'étudiant
         */
        public function desinscrire($iduser)
        {
        	$sql = "
        		DELETE c
        		FROM tj_cnd_inscrire_ssn_cis AS c
        		WHERE cis_id_candidat = :iduser 
        	";
        	$stmt = $this->_db->query($sql, array('iduser' => (int) $iduser));
     
        }
    }
    Le genre de requête un peu complexe figurant dans cet exemple me prend généralement moins de 5 minutes à écrire et à vérifier dans phpMyAdmin. De mémoire, je n'avais pas réussi à les faire avec le pseudo SQL saucissonné de ZF, pas plus qu'avec Hibernate en Java d'ailleurs !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  7. #7
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    On ne dis de quelque chose que c est n importe quoi par le simple fait qu on arrive pas à l utilisé. De plus ta requête est simple elle ne contient rien de spéciale comme concat et if par exemple.

    Les dépendences de tables existent, dans certains cas il est vrai que cela peut être un inconvénient mais pas ici.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. résultat de requête avec deux champs issus du même champ initial
    Par Macrounet dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/08/2010, 17h38
  2. [Vxi3] Tableau de résultat de requête avec résultat autre requête
    Par SebastienM dans le forum Webi
    Réponses: 6
    Dernier message: 14/12/2009, 11h26
  3. Réponses: 3
    Dernier message: 30/06/2009, 19h16
  4. Conversion d'une requête avec JOIN
    Par SQLNewbie dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/12/2008, 20h03
  5. [MySQL] Résultat de requête avec LEFT
    Par Msieurduss dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2008, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo