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 :

Zend DB - Jointure


Sujet :

Zend_Db PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    As-tu essayé avec Zend_Db_Select ?
    http://julien-pauli.developpez.com/t.../?page=Zend_Db

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    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 ...

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Regarde le deuxième exemple ici : http://julien-pauli.developpez.com/t...=Zend_Db#LIX-F

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    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.

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Oui, c'est exactement ce que fait cet exemple. Où est le problème ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Le 1er soucis, c'est déjà quand je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    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.

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Pourquoi est-ce que tu mets la même table à la fois dans from et dans join ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    En effet c'est ld_news ...

    Donc je reprend

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ....

  11. #11
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    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...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    	}

  13. #13
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Bon, tu es passé de $db->select à $table->select, l'erreur a t-elle changé ?

    Avec code, qu'obtiens tu comme erreur ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    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 : 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
    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 ;

  15. #15
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    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.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Bah si :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  17. #17
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    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 ...

  19. #19
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $select = $db->select()->from(...)->where(...); //$select est un Zend_Db_Select
    $db->query($select);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Très juste, ma classe NewsModel hérite de Zend_Db_Table_Abstract

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	function newsAction() {
    		$news = new NewsModel();
        	$this->view->news = $news->getNews();
    	}

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. Réponses: 16
    Dernier message: 20/05/2015, 13h36
  3. jointure de table avec Zend Framework
    Par leon86 dans le forum MVC
    Réponses: 4
    Dernier message: 23/01/2011, 14h13
  4. Jointure entre 2 tables en utilisant zend
    Par king_soft dans le forum Zend_Db
    Réponses: 9
    Dernier message: 17/12/2010, 09h52
  5. [ZF 1.10] jointure de deux tables de base de données zend
    Par joulive dans le forum Zend_Db
    Réponses: 5
    Dernier message: 01/05/2010, 06h01

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