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 :

Flux RSS + requête entre plusieurs tables liées [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de blasil64
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 324
    Points : 136
    Points
    136
    Par défaut Flux RSS + requête entre plusieurs tables liées
    Bonsoir à tous,
    Je cherche à créer un flux RSS lors de mon stage. Ce flux doit permettre de voir les 20 derniers trajets de covoiturage en cours. Le problème est que je ne dois pas requêter une seule table (ça aurait été trop facile), je dois requêter 2 ou 3 tables qui sont liées. Par exemple, la table trajet qui contient entres autres le champ idville_depart et la table ville qui contient le champ idville.

    Mais je n'ai pas à ma connaissance la syntaxe exacte d'un requête.
    Je sais seulement que l'on peut faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        $q = Doctrine_Query::create()
              ->select()
              ->from('Trajet t')
              ->orderBy('t.idtrajet')
              ->limit(20);
     
        $posts = $q->execute();
    Mais après comment faire si je veux afficher le champ nomVille qui se trouve dans la table Ville qui est liée au champ idville_depart de la table trajet. Je voudrais accéder au nom de la ville, et aussi aux autres champs de ville. Et si je veux d'autres informations d'une autre table liée à la table trajet ?

    Comment puis-je faire ?

    Merci d'avance pour votre aide !

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Bonsoir,

    Tu dois utiliser les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        $q = Doctrine_Query::create()
              ->select()
              ->from('Trajet t')
              ->orderBy('t.idtrajet')
              ->leftJoin('t.Ville v')
              ->limit(20);
     
        $posts = $q->execute();
    Par exemple, ça te fera une requête qui récupère les 20 trajets avec leur ville correspondante.
    Pour récupérer la ville, tu feras quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ville = $posts->getVille()->getNomVille();
    Bon, j'ai pas tout ton code devant les yeux mais je pense que ça peut t'aider (à savoir que tu peux faire plusieurs leftJoin() dans ta requête si tu as plusieurs tables liées !).
    symfony power user !

  3. #3
    Membre habitué Avatar de blasil64
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 324
    Points : 136
    Points
    136
    Par défaut
    Ok merci pour la solution avec les join. Au moins j'aurai appris quelque chose. Mais au final, je ne l'ai pas utilisé moi même, j'ai créé une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public function getLatestTrajets(Doctrine_Query $q = null)
      {
      	return $this->addActiveTrajetsQuery($q)->orderby('created_at DESC')->limit(20)->execute();
      }
    }
    Cette fonction fait donc appel à la fonction addActiveTrajetsQuery qui renvoie tous les trajets actifs, et ma fonction renvoie les 20 derniers actifs du coup. Du coup mon flux RSS ressemble à ceci :
    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
    28
    29
    30
    public function executeDerniersTrajetsRSS(sfWebRequest $request)
      {
      	$feed = new sfRssFeed();
     
        $feed->initialize(array(
            'title'       => 'Titre du flux',
            'link'        => 'site web',
            'authorEmail' => 'adresse mail',
            'authorName'  => 'Nom de l\'auteur du flux'
        ));
     
     	$posts = Doctrine::getTable('Trajet')->getLatestTrajets();
     
        foreach ($posts as $post)
        {
          $item = new sfFeedItem();
     
          $item->initialize(array(
              'title'       => $post->Depart->Ville.' ('.$post->Depart->Ville->getCodePostal().') => '.$post->Destination->Ville.' ('.$post->Destination->Ville->getCodePostal().')',
              'link'        => 'lien vers le résultat d\'un flux',
              'authorName'  => $post->Utilisateur->Profile->getPrenom(),
              'authorEmail' => 'adresse mail de l\'auteur',
              'pubDate'     => $post->getDateTimeObject('created_at')->format('U'),
          ));
     
          $feed->addItem($item);
        }
     
        $this->feed = $feed;
      }
    Et cela fonctionne bien.

    Merci à toi pour ta réponse !

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    C'est un peu comme d'avoir une porche sous la main et d'y accrocher deux bœufs pour la faire avancer histoire de ne pas abimer le bouchon de remplissage du réservoir !

    Je ne doute pas que cela marche mais si tu as 20 lignes dans ton feed, et à vue d'œil, je ne suis pas entré dans le fond du code, tu vas te retrouver avec 21 requêtes (les 20 trajets et 1 pour les villes de chacun des 20 trajets), d'où des pertes côté performance en montée de charges.

    De plus, je vais être un peu puriste, tu fais de la mise en page dans la couche contrôleur, ce qui n'est pas l'idéal, surtout que tu vas bien devoir refaire une mise en forme dans la couche vue (le template DerniersTrajetsRSSsuccess.rss.php) pour construire la forme de ton flux.

    Si tu te contentes de récupérer les données (avec un lien entre les tables) dans la partie model (tel que tu le fais presque), la partie contrôleur va rechercher ces données et les renvoyer à la vue. Le truc bien avec symfony c'est qu'il est capable de choisir le template en fonction du flux de sortie donc un contrôleur et tu peux afficher en html (xhtml) avec le template <action>success.php, en format feed atom <action>success.atom.php sans avoir rien a changer au contrôleur ni au modèle, juste un réglage dans les routes pour accepter les demandes correspondantes. Voir l'exemple du jour 14.

    Bonne chance
    Michel
    Bonne année 2010
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Requête entre 2 tables indirectement liées
    Par MediaTempora dans le forum Modélisation
    Réponses: 13
    Dernier message: 20/02/2015, 18h01
  2. Optimiser Requêtes entre plusieurs tables
    Par Korben-Dallas dans le forum Débuter
    Réponses: 6
    Dernier message: 24/06/2010, 18h34
  3. Réponses: 4
    Dernier message: 20/05/2010, 12h28
  4. Réponses: 1
    Dernier message: 26/03/2007, 01h20
  5. [Requête] Sommes entre plusieurs tables
    Par Ithilien dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 05/01/2007, 15h34

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