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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 40
    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 : 40
    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() )
    }

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