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

PHP & Base de données Discussion :

[Doctrine] Exécution d'une jointure externe


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut [Doctrine] Exécution d'une jointure externe
    Bonjour,
    J'ai un petit problème lorsque je veux joindre deux tables avec Doctrine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $q = Doctrine_Query::create()
    	 ->select('n.titre, n.auteur, n.contenu, c.auteur, c.contenu')
    	 ->from('news n')
    	 ->leftjoin('commentaires c')
    	 ->execute();
    ?>
    Mais ce code produit une exception Doctrine_Hydrator_Exception, dont je ne parviens pas à saisir la cause :

    "commentaires" with an alias of "c" in your query does not reference the parent component it is related to.
    Je vous joins les modèles de mes classes :

    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
    <?php
    abstract class DoctrineNews extends Doctrine_Record
    {
        public function setTableDefinition()
        {
            $this->setTableName('news');
            $this->hasColumn('id', 'integer', 8, 
                             array('type' => 'integer',
                                   'length' => 8,
                                   'primary' => true,
                                   'autoincrement' => true));
            $this->hasColumn('titre', 'string', 100);
    		$this->hasColumn('auteur', 'string', 100);
    		$this->hasColumn('contenu', 'string', 4000);
        }
    }
    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
    <?php
    abstract class DoctrineCommentaires extends Doctrine_Record
    {
        public function setTableDefinition()
        {
            $this->setTableName('commentaires');
            $this->hasColumn('c_id', 'integer', 8, 
                             array('type' => 'integer',
                                   'length' => 8,
                                   'primary' => true,
                                   'autoincrement' => true));
            $this->hasColumn('id_news', 'integer', 8);
    		$this->hasColumn('auteur', 'string', 100);
    		$this->hasColumn('contenu', 'string', 4000);
        }
    }
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    Le message dit qu'il manque la table parent
    "commentaires" with an alias of "c" in your query does not reference the parent component it is related to.
    Il faut donc l'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    $q = Doctrine_Query::create()
    	 ->select('n.titre, n.auteur, n.contenu, c.auteur, c.contenu')
    	 ->from('news n')
    	 ->leftjoin('n.commentaires c')
    	 ->execute();
    ?>
    De plus dans ta définition de ta table commentaire tu n'as pas indiqué id_news est une clé étrangère. voir la commande setup()

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci de ta réponse (et désolé de ma tardive).
    J'ai modifié mes modèles comme ceci :

    NewsModel

    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
    <?php
    abstract class NewsModel extends Doctrine_Record
    {
        public function setTableDefinition()
        {
    		//On définit le nom de notre table, "news"
            $this->setTableName('news');
     
    		//Puis tous les champs
            $this->hasColumn('id', 'integer', 8, array('primary' => true,
    						   'autoincrement' => true));
            $this->hasColumn('titre', 'string', 100);
    		$this->hasColumn('auteur', 'string', 100);
    		$this->hasColumn('contenu', 'string', 4000);
        }
     
        public function setUp() {
        	$this->hasMany(
        		'Commentaires as commentaire', 
        		array(
        			'local' => 'id', 
        			'foreign' => 'id_news'
        		)
        	);
        }
     
    }
    CommentairesModel
    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
    <?php
    abstract class CommentairesModel extends Doctrine_Record
    {
        public function setTableDefinition()
        {
    		//On définit le nom de notre table, "news"
            $this->setTableName('commentaires');
     
    		//Puis tous les champs
            $this->hasColumn('id', 'integer', 8, array('primary' => true,
    						   'autoincrement' => true));
    		$this->hasColumn('id_news', 'integer', 8);
            $this->hasColumn('contenu', 'string', 4000);
        }
     
        public function setUp() {
        	$this->hasOne(
        		'News as news', 
        		array(
        			'local' => 'id_news', 
        			'foreign' => 'id'
        		)
        	);
        }
     
    }
    Et ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    //...
    $q = Doctrine_Query::create()
    		->select('n.titre, c.contenu')
    		->from('news n')
    		->leftJoin('Commentaires c')
    		->execute();
    Mais c'est toujours la même chose...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Non regarde bien la requête de batataw, et plus particulièrement le left join:
    C'est n.Commentaires c et pas Commentaires c.

Discussions similaires

  1. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52
  2. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  3. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 16h34
  4. Ordre d'exécution dans une jointure externe
    Par Pero dans le forum Langage SQL
    Réponses: 17
    Dernier message: 20/09/2005, 12h22
  5. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10

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