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 :

Jointure Best Practises [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut Jointure Best Practises
    Comment faire pour récupérer tous les objets ZuluTree appartenant à un ZuluCategory en une seule requête?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ZuluTreeCategory:
      columns:
        tree_id:  { type: integer, primary: true }
        category_id: { type: integer, primary: true }
      relations:
        ZuluCategory:  { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: ZuluCategory}
        ZuluTree: { onDelete: CASCADE, local: tree_id, foreign: id, foreignAlias: ZuluTree }

    J'ai essayé de faire ça dans la classe ZuluTreeCategoryTable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {
     
     
    		$q = Doctrine_Query::create()
    		->select('j.tree_id,t.*')
    		->from('ZuluTreeCategory j')
    		->innerJoin('j.ZuluTree t')
    		->where('j.category_id = ?', $category->getId());
     
    		return $q->execute();
     
    	}
    Mais, je suppose qu'on peut faire plus simple?

    De plus, si je fais un unit test comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $category = Doctrine_Core::getTable('ZuluCategory')
    	->createQuery()
    	->limit(1)
    	->fetchOne();
     
     
     
    	$t->is(Doctrine::getTable('ZuluTreeCategory')->getTreesForOneCategory($category)->get(0)->getTown(), 'Berlin', 'infos du premier arbre de la category 2');

    J'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Unknown record property / related component "town" on "ZuluTreeCategory"
    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    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
     
    ZuluCategory:
      relations:
        Trees:
          class: ZuluTree
          refclass: ZuluTreeCategory
          local: category_id
          foreign: tree_id
          foreignAlias: Categories
     
    ZuluTreeCategory:
      columns:
        tree_id:  { type: integer, primary: true }
        category_id: { type: integer, primary: true }
      relations:
        ZuluCategory:  { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: ZuluCategory}
        ZuluTree: { onDelete: CASCADE, local: tree_id, foreign: id, foreignAlias: ZuluTree }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $category->getTrees();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Effectivement, merci.
    Par contre, j'utilise une pagination avec sfDoctrinePager et donc il faudrait que je passe en paramètre la requête et non la doctrine_collection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
     $this->zulu_trees = Doctrine::getTable('ZuluTree')->getAllQuery();
    
      $this->pager = new sfDoctrinePager('ZuluTree', 8);
    	  $this->pager->setQuery( $this->zulu_trees);
    	  $this->pager->setPage($request->getParameter('page', 1));
    	  $this->pager->init();
    Donc, il y aura un execute() sur la query passée, ce qui marche pas avec $category->getTrees();

  4. #4
    Invité
    Invité(e)
    Par défaut
    D'accord. Dans ce cas le bout de code que tu as mis dans ton post précédent fonctionne non ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Non, car mon test avec getTown plantait.
    Je n'arrivais pas à récupérer tous les attributs du ZuluTree.

  6. #6
    Invité
    Invité(e)
    Par défaut
    D'un côté tu me parles d'un pager qui a donc besoin d'une query, d'un autre côté tu me parles d'un test, qui lui a besoin d'une collection.

    Qu'est ce que tu cherches à faire ? Je n'arrive pas à te suivre.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    On oublie le test.
    Je me concentre sur le pager uniquement qui doit prendre une query et non une collection.

    Merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Donc si j'ai bien compris, tu as un objet ZuluCategory, et tu veux récupérer les ZuluTree associés et les paginer.

    Dans ce cas tu peux simplement faire, dans ZuluTreeTable.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     // ZuluTreeTable.class.php
    public static function getTreesForCategoryQuery(ZuluCategory $category)
    {
      return $q = $this->createQuery('t')
        ->where('t.category_id = ?', $category->getId());
    }
    Non ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    En fait, l'association entre les catégories et les trees est faite dans la table ZuluTreeCategory qui contient une clé primaire double (tree_id,category_id).

    Si je fais à peu près la même méthode que toi dans le ZuluTreeCategory, je vais sûrement récupérer que la liste des tree_id matchant la category que j'ai passé en paramètre.

    Mais moi je veux pas récupérer uniquement les id mais tous les attributs de chaque ZuluTree.

    Je dois faire ça en une seule query et retourner la query à mon paginer.

    Merci

  10. #10
    Invité
    Invité(e)
    Par défaut
    Désolé j'ai été trop vite.

    Oui je comprend bien que tu as besoin de toutes les colonnes de ZuluTree, c'est d'ailleurs pour ça que moi j'ai dit de faire ça dans ZuluTreeTable et non ZuluTreeCategoryTable.

    Donc pour poursuivre dans mon idée, peut-être que ceci conviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // ZuluTreeTable.class.php
    public static function getTreesForCategoryQuery(ZuluCategory $category)
    {
      return $q = $this->createQuery('t')
        ->innerJoin('t.ZuluTreeCategories tc')
        ->where('tc.category_id = ?', $category->getId());
    }
    Par contre il faudrait juste changer un peu ton schema.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ZuluTreeCategory:
      columns:
        tree_id:  { type: integer, primary: true }
        category_id: { type: integer, primary: true }
      relations:
        ZuluCategory:  { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: ZuluTreeCategories}
        ZuluTree: { onDelete: CASCADE, local: tree_id, foreign: id, foreignAlias: ZuluTreeCategories }
    A priori là ça devrait le faire. Sinon je vais me coucher xD

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Merci, ça marche bien.
    Par contre, à moi de jouer pour comprendre comment marche le plugin Paginer pour y intégrer la query car le setQuery n'est pas suffisant pour exécuter la query que tu viens de me dire..

  12. #12
    Invité
    Invité(e)
    Par défaut
    Euh globalement le pager c'est très simple à utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $this->pager = new sfDoctrinePager('ZuluTree', $nombreParPage); // Instanciation du pager
    $this->pager->setQuery($q); // On set la query qui va être utilisée
    $this->pager->setPage($numPage); // On set la page que l'on veut
    $this->pager->init(); // On initialise le pager
    Et puis dans ton template tout bêtement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($pager->getResults() as $zuluTree):

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

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. WCf & Best Practises
    Par DaMo` dans le forum Windows Communication Foundation
    Réponses: 5
    Dernier message: 29/04/2010, 16h15
  3. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 12h21
  4. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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