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

Symfony PHP Discussion :

Récupérer les données d'une jointure


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut Récupérer les données d'une jointure
    Bonsoir,

    je suis pas à pas le tutoriel Jobeet sur le site de symfony, en créant à côté mon propre site. J'ai pas mal factorisé ma base de donnée en utilisant des tables de relation. Résultat : j'ai besoin de faire des jointures multiples (sur trois tables).

    Actuellement je procède de la sorte dans le contrôleur (je passerais tout ça dans le model une fois que ça marchera):
    (2 tables: com et dev, dev_com étant la table de relation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function executeIndex(sfWebRequest $request)
      {
    	$q = Doctrine_Query::create()
    	 ->select('c.*, d.*, d2.*')
        ->from('Com c')
        ->leftjoin('c.DevCom d on c.idCom = d.Com_idCom')
        ->leftjoin('d.Dev d2 on d2.idDev = d.dev_idDev');
        $this->coms = $q->execute();
      }
    ça marche. Je ne sais pas si c'est très propre mais ça marche.

    Mon problème est tout simple : je ne sais pas comment récupérer les données dans ma vue !

    pour la table com, aucun problème :
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><?php echo $com->getCom() ?></td>
    pour les tables dev et dev_com, c l'enfer.

    ----
    Au passage, une petite question supplémentaire: dans le formulaire d'édition ( monsite.com/com/new), doctrine arrive à me retrouver tout seul comme un grand les valeurs de dev (j'ai configurer les to_string qui vont bien dans la classe com). J'imagine que doctrin fait des jointures automatiques. Y-a-t-il un moyen de faire appel à ces jointures automatiques depuis la vue ou le contrôleur ?
    ---

    merci à vous

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    bon, j'ai réussis à obtenir quelques choses avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $com->DevCom[0]->getDevIddev() ?>
    qui me renvoie l'id du Dev.
    Je me suis dit bêtement qu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $com->Dev[0]->getName() ?>
    me permettrais d'accéder au champs name de la table Dev, mais non.
    J'ai testé aussi un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $commentaires->DevisCommentaires[0]->Devis[0]->getClient() ?>
    mais ça ne marche pas non plus...
    En regardant en détail l'objet com (), j'ai vu que l'obet devis avait la particularité d'être en *Recursion* :
    Com Object *RECURSION* [Devis] =>
    ça peut-être un rapport...

  3. #3
    Membre chevronné Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Par défaut
    Bonsoir,
    tu as aussi le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $com->DevCom->getFirst()->getDevIddev() ?>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $com->getDevCom()->getFirst()->getDevIddev() ?>
    qui devrait marcher aussi, enfin, j'utilise souvent le getFirst() dans l'action mais dans le template, l'objet est également accessible donc ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Salut sacricri,

    je ne vois pas trop l'intérêt du '->getFirst()' qui rajoute pas mal de caractère à écrire par rapport à '[0]' ?

    Ceci dit, tu as peut-être une idée pour récupérer le champs 'Nom' de la troisième table jointe ?

    Enfin, plus je vois la complexité de mon code pour récupérer les valeurs des tables, plus je me dis que j'ai du rater quelque chose...

    Est-ce que dans symfony il est déconseillé de faire des tables de relation ? Est-ce qu'en remplaçant dans mysql-workbench ces tables de relation par des relations tout court de type one-to-one ou one-to-many cela simplifierait les choses?

    En y repensant, je me dis que je devrais rajouter des méthodes dans dev.class.php et com.class.php pour accéder directement aux valeurs concernés...

    Quel voie dois-je suivre ?
    J'ai besoin d'aide...... je crois que je vais pleurer....

  5. #5
    Membre chevronné Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Par défaut
    S'il ne s'agit que d'affichage et non de travail sur les données que tu récupères, tu devrais hydrater en array et tu pourras du coup, lire plus facilement les données que tu récupères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function executeIndex(sfWebRequest $request)
      {
    	$q = Doctrine_Query::create()
    	 ->select('c.*, d.*, d2.*')
        ->from('Com c')
        ->leftjoin('c.DevCom d on c.idCom = d.Com_idCom')
        ->leftjoin('d.Dev d2 on d2.idDev = d.dev_idDev');
        $this->coms = $q->execute(array(), Doctrine::HYDRATE_ARRAY);
       print_r($this->coms);
      }
    Mais je te conseille également de placer ta méthode dans ton modèle (ComTable.class.php), c'est sa place.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le secret est dans le schéma.

    Très simple, des parents et les noms des enfants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    parent:
      columns:
        nom: string(50)
        prenom: string(50)
      relation;
        enfants:
          class: enfant
          foreign: parent_id
          foreignAlias: parents
    enfant:
      columns:
        prenom: string(50)
        parent_id: integer(8)
    Donc la requête pour récupérer tous les enfants et leurs parents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function executeIndex(sfWebRequest $request)
    {
        $q = Doctrine_Query::create()
            ->from('enfant e')
            ->leftjoin('e.parents p')
         $enfants = $q->execute()
      }
    Dans le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php foreach ($enfants as $enfant): .>
      <?php echo $enfant->getPrenom() ?> fils de <?php $enfant->getParents()->getNom() ?>
    <?php endforeach ; ?>
    Un peu simpliste mais l'idée devrait y être.

    Le nom donné dans la relation "parents" est utilisé depuis l'objet enfant pour obtenir l'objet unique parent.

    Dans le cas où tu partirais des enfants, le non dans foreignAlias enfants donnerait une collection des objets enfants et tu pourrais utiliser un code du genre

    foreach ($parent->getEnfants() as $enfant)
    {
    print($enfant->getPrenom() )
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    merci pour ta réponse mimi68.

    J'ai refait tout le schéma de la bdd, et je n'ai laissé que des relation de type 1:n au maximum. Donc je ne pourrais pas continuer à essayer de résoudre ce problème, vu que je n'ai plus que des jointures entre deux tables maximum.

    Je suis un gros débutant sur Doctrine, et si j'ai bien compris les fondamentaux de la programmation objet j'avoue encore être un peu perdu dès que l'on chaine des tas d'objets, de méthodes, etc... Je le fais pourtant assez naturellement avec jQuery, mais là avec symfony, je ne comprends pas toujours ce que je fais. Je ne doute pas que dès que j'aurais fait deux ou trois projets en entier ça viendra !

    Ceci dit, je commence à digérer un peu la méthode symfony, et je n'écris plus que des requêtes dans le style de celle que tu proposes. C'est à dire, pour une table toto, j'ajoute dans TotoTable.class.php une requête doctrine stoquée dans une variable (ici : $enfants=$q->execute), que j'appelle depuis le contrôleur, puis j'utilise les Getters associés dans le template.

    Donc avec le recul, je crois que mon problème venait de ce que j'avais stoqué ma requête de cette façon: $this->coms = $q->execute(). Je ne vois même pas trop ce que cela veut dire, j'avais recopier ce code bêtement du tuto...

    Toutefois, en cherchant pas mal sur le net, je me suis aperçu que la question de la récupération des données dans une relation many to many pose problème à pas mal de gens. Cela pourrait être intéressant de faire un mini-tuto sur le sujet, en prenant en exemple une requête sur trois tables jointes.

    voilou... merci encore à vous deux

  8. #8
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le tuto est dans le tuyau, en fasse finale.

    Il faut que j'ai une vingtaine d'heure pour la relecture et la mise en ligne.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    super,
    vous êtes vraiment des boss sur ce forum.
    Je suis complètement autodidacte (comme ça arrive assez souvent dans le milieu du Web), et très clairement j'ai énormément appris grâce à vos équipes. Parfois, quand on est désespéré et seul face à son écran, ça fait vraiment du bien d'avoir des cadors à la rescousse

    J'ai emprunté à la bibliothèque du coin une ancienne version de 'La Programmation Orienté Objet' de Hugues Bersini aux éditions Eyrolles, et ça m'a ouvert l'esprit: d'un coup, beaucoup de choses sont devenue plus claires... (en plus, c rempli de citation de philo et de sciences cog: j'adore...) Je pense que je vais acheter la nouvelle version vu qu'elle inclut des exemples en PHP5:
    http://www.eyrolles.com/Informatique...-9782212124415

    Je crois que mon vrai problème venait de là : niveau trop faible en orienté objet.

Discussions similaires

  1. [1.x] récupérer les données d'une jointure: symfony
    Par marwina32 dans le forum Symfony
    Réponses: 35
    Dernier message: 10/09/2010, 12h35
  2. récupérer les données d'une fenetre
    Par snoopo dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 23/06/2006, 17h23
  3. Réponses: 15
    Dernier message: 20/06/2006, 10h29
  4. Récupérer les données après une recherche
    Par cdumas dans le forum Access
    Réponses: 7
    Dernier message: 04/05/2006, 12h09
  5. Récupérer les données d'une iframe
    Par juli1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/02/2005, 22h53

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