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 16/11/2011, 19h51   #1
Invité de passage
 
Homme
Développeur Web
Inscription : 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 : 1
Points : 1
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 :
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 :
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 :
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 :
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...
elmo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 20h57   #2
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
essaye array('login') à la place de 'login'
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 21h23   #3
Invité de passage
 
Homme
Développeur Web
Inscription : 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 : 1
Points : 1
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...
elmo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 14h46   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
É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 :
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 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 18/11/2011, 19h46   #5
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Et perds la traitement des données fais par Zend. Et Zend_Db n est pas vraiment un ORM
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 07h31   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Voilà un exemple de ce qu'il est possible de faire avec Zend Framework et des requêtes en SQL natif :
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
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 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 19/11/2011, 10h31   #7
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
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.
5h4rk 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 08h07.


 
 
 
 
Partenaires

Hébergement Web