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 06/04/2008, 02h16   #1
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Par défaut Zend DB - Jointure

Bonjour

En fait j'essaye de faire une jointure relativement via Zend Db, mais rien n'y fait pas moyen de faire passé la requête avec les différente façon décrite dans la doc de Zend Db ...

Code :
1
2
3
4
SELECT *
FROM `ld_news` AS n
JOIN `ld_users` AS u
ON n.news_author = u.user_id
Est ce que quelqu'un connais la bonne syntaxe pour faire cette requête ?

Même en essayant le :

Code :
$this->view->news = $db->fetchAll( 'SELECT * FROM `ld_news` AS n JOIN `ld_users` AS u ON n.news_author = u.user_id' );
Ca renvoie une erreur : SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

Merci.
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 03h22   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

As-tu essayé avec Zend_Db_Select ?
http://julien-pauli.developpez.com/t.../?page=Zend_Db
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 04h06   #3
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
J'ai beau echotter ma requête, et essayer de corriger la "syntaxe" PDO, pas moyen d'en faire façon, ça ne donne jamais ce que je veux.

Il me faudrai une syntaxe correct pour la requête préciser ci dessus, en effet je ne trouve pas d'exemple correspondant a ce que je recherche, vu que je veux récupéré toutes les colonnes ...
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 10h37   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Regarde le deuxième exemple ici : http://julien-pauli.developpez.com/t...=Zend_Db#LIX-F
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 14h35   #5
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Bah c'est exactement cette exemple que je tourne dans tous les sens.

Mon principal problème, c'est que je fais un SELECT * et pas 2/3 champs en particulier.
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 14h38   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Oui, c'est exactement ce que fait cet exemple. Où est le problème ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h00   #7
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Le 1er soucis, c'est déjà quand je fait ceci :

Code :
$db->fetchAll( 'SELECT * FROM `ld_news` AS n JOIN `ld_users` AS u ON n.news_author = u.user_id' );
Ca donne : SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s).

Alors que la requête passe très bien en console ....

Ensuite pour le montage avec le system de ZF pour construire les requêtes, je monte mon truc comme l'exemple :

Code :
1
2
$db->select()->from('ld_news', 'news')
	->join('ld_users', 'ld_users.user_id = ld_news.author', 'real_name');
Warning: Select query cannot join with another table in /home/dev/d4n_svn/trunk/library/Zend/Db/Table/Select.php on line 191
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h06   #8
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Je te conseille fortement d'utiliser l'objet SELECT, comme Yogui te l'a conseillé.

Ensuite, vérifies les noms de tes tables et champs. Puis personnellement j'ai eu quelques difficultés avec JOIN, j'utilise maintenant JOIN LEFT, qui me suffit dans mon cas.

Bon courage.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h09   #9
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Pourquoi est-ce que tu mets la même table à la fois dans from et dans join ?
Code :
1
2
$db->select()->from('news')
    ->join('ld_users', 'ld_users.user_id = ld_news.author', 'real_name');
Par ailleurs, "news" ne semble pas être le nom réel de ta table.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h21   #10
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
En effet c'est ld_news ...

Donc je reprend

Code :
1
2
$db->select()->from('news') // ou 'ld_news' même résultat ...
    ->join('ld_users', 'ld_users.user_id = ld_news.author', 'real_name');
SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty

Marche pas ...

Code :
1
2
$db->select()->from('ld_news')
    ->joinLeft('ld_users', 'ld_users.user_id = ld_news.author');

SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty

Alors la ... je suis totalement paumé ... c'est dingue que ça soit si complex de faire un pauv' join ....
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h26   #11
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Alors quelques conseilles :
  • Montre nous l'ensemble du code, pas seulement la requête
  • Indentes ton code afin qu'il soit plus lisible

Montre nous la partie du code où tu exécutes la requête. L'erreur semble dire que tu n'envoies pas la requête à exécuter...
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h29   #12
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Code :
1
2
3
4
5
6
7
	public function getNews() {
		$table = new NewsModel();
		$order = 'news_time DESC';
		$select = $table->select()->from('news')
    					->joinLeft('ld_users', 'ld_users.user_id = ld_news.author');
    		$table->fetchAll($select);
	}
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h31   #13
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Bon, tu es passé de $db->select à $table->select, l'erreur a t-elle changé ?

Avec code, qu'obtiens tu comme erreur ?
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h43   #14
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Non en fait j'ai changer $table pour $db, histoire que ce soir plus clair.

SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty

J'imagine qu'il est utile de préciser le shéma de mes deux table :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE IF NOT EXISTS `ld_news` (
  `news_id` int(11) NOT NULL auto_increment,
  `title` varchar(50) NOT NULL,
  `news` text NOT NULL,
  `news_time` int(11) NOT NULL,
  `news_author` int(11) NOT NULL,
  PRIMARY KEY  (`news_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
 
CREATE TABLE IF NOT EXISTS `ld_users` (
  `user_id` int(11) NOT NULL auto_increment,
  `real_name` varchar(30) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(255) NOT NULL,
  `registered` int(11) NOT NULL,
  PRIMARY KEY  (`user_id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `name` (`real_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h50   #15
Membre Expert
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 331
Points : 2 331
Pour faire ta requête utilise l'adapteur spécifique à ta base de données. Je ne suis pas sur que l'objet Table peut être utilisé pour les requêtes.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 15h52   #16
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Bah si :/

Code :
1
2
3
4
5
6
7
8
9
	public function getShortNews() {
		$table = new NewsModel();
		$order = 'news_time DESC';
		$count  = 5;
		$select = $table->select()->order($order)
                          ->limit($count);
 
    	return $table->fetchAll($select);
	}
Cela fonctionne très bien tant qu'il n'y a pas de join ...
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 16h05   #17
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Est-ce que tu as essayé cette syntaxe ?
http://framework.zend.com/manual/en/....building.join

Sinon, il me semble que tu peux faire echo de ton $select.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 16h09   #18
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
C'etait la 1er que j'ai tester, pas moyen de faire quelque chose avec.

Pour ce qui est du echo $select, oui c'est possible, mais vu qu'il ne sais pas la construire, ca passe pas ...
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 16h23   #19
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Je viens de voir un détail qui m'étonne.

De quelle classe hérite NewsModel ?
Normalement, l'idée est d'utiliser $db en tant qu'Zend_Db_Adapter_* et non en tant que Zend_Db_Table. Tu ne peux pas interchanger $db et $table, ce n'est pas logique.

$db est un objet Zend_Db_Adapter_*
$table est un objet Zend_Db_Table
Tu peux obtenir $db à partir de $table->getAdapter().

Un $select se fait généralement à partir de $db ou $table mais pas dans les mêmes conditions :
Code :
1
2
$select = $db->select()->from(...)->where(...); //$select est un Zend_Db_Select
$db->query($select);
Code :
1
2
$select = $table->select->where(...): //$select est un Zend_Db_Table_Select
$table->getAdapter()->query($select);
Sachant que si tu as des modèles, tu as sans doute besoin de la 2° méthode.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2008, 16h40   #20
Invité de passage
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 4
Points : 4
Très juste, ma classe NewsModel hérite de Zend_Db_Table_Abstract

Code :
1
2
3
4
	public function getNews() {
		$table = new NewsModel();
    	return $table->getAdapter()->fetchAll( 'SELECT * FROM `ld_news` AS n JOIN `ld_users` AS u ON n.news_author = u.user_id');
	}
Du coup ca passe parfaitement bien, le probleme c'est que ca me retourne un array et pas un Zend_Db_Table_Rowset Objec ...

Enfin c'est utilisable, mais c'est pas ce que je veux :p

La grande question est de savoir pourquoi mes autre select basique passe uniquement avec $table dans cette meme class.

AUssi, je fait de passé par getAdapter() c'est un comportement normal ou c'est mon organisation qui foire ?

Il est utile de préciser comment je traite au niveau du controller
Code :
1
2
3
4
5
 
	function newsAction() {
		$news = new NewsModel();
    	$this->view->news = $news->getNews();
	}
Coyote Terrorist est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web