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

ORM PHP Discussion :

Doctrine Nested set: récupérer les items de toute la sous-arborescence.


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut Doctrine Nested set: récupérer les items de toute la sous-arborescence.
    Bonjour,

    Je poste ce message pour être sûr que mon idée est bien la bonne car je suis débutant.
    Petit récapitulatif (juste l'affichage des items couplé à leur catégorie):

    Schema.yml:
    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
     
    Category:
      actAs:
        NestedSet:
          hasManyRoots: true
          rootColumnName: root_id
      columns:
        name:
          type: string()
     
    Item:
      columns:
        name:
          type: string()
        category_id:
          type: integer
      relations:
        Category:
          local: category_id
          foreign: id
          foreignAlias: Items
    fixture:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    Category:
      arbre:
        name: Arbre
        children:
          1:
            name: Catégorie principale 1
            children:
                11:
                  name: Catégorie secondaire 1
                12:
                  name: Catégorie secondaire 2
                13:
                  name: Catégorie secondaire 3
                14:
                  name: Catégorie secondaire 4
                  children:
                    141:
                      name: Catégorie tertiaire 1
                    142:
                      name: Catégorie tertiaire 2
                15:
                  name: Catégorie secondaire 5
                16:
                  name: Catégorie secondaire 6
          2:
            name: Catégorie principale 2
          3:
            name: Catégorie principale 3
            children:
                31:
                  name: Catégorie secondaire 1
                32:
                  name: Catégorie secondaire 2
                33:
                  name: Catégorie secondaire 3            
          4:
            name: Catégorie principale 4
            children:
              41:
                name: Catégorie secondaire 1
     
     
    Item:
      i1:
        name: Baseline
        Category: 11
      i2:
        name: Product
        Category: 11
      i3:
        name: Analysis
        Category: 12
      i4:
        name: Architecture
        Category: 12
      i5:
        name: Design review
        Category: 12
      i6:
        name: Feature analysis
        Category: 13
      i7:
        name: Implementation
        Category: 141
      i8:
        name: Review
        Category: 141
      i9:
        name: Test
        Category: 142
      i10:
        name: Stabilization
        Category: 16
      i11:
        name: Feature 
        Category: 16
      i12:
        name: Feature view
        Category: 2
      i13:
        name: Fixing
        Category: 2
      i14:
        name:  Repport
        Category: 41
    Avec ça je peux afficher les items couplé à leur catégorie dans mon template avec un truc du genre:
    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
     
    class CategoryTable extends Doctrine_Table
    {
    	public function withItems()
    	{
    		$q = Doctrine_Query::create()
    		->select('c.name')
    		->from('Category  c')
    		->leftJoin('c.Items i');
     
    		$treeObject = Doctrine_Core::getTable('Category')->getTree();
    		$treeObject->setBaseQuery($q);
    		$tree = $treeObject->fetchTree();
    		$treeObject->resetBaseQuery();
     
    		return $tree;
    	}
    }
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Category extends BaseCategory
    {
     
    	public function getItems()
    	{
    		  $q = Doctrine_Query::create()
    		->from('Item i')
    		->where('i.category_id = ?', $this->getId());
     
    		return $q->execute();
    	}
    }
    MAINTENANT:
    Je veux afficher une categorie avec ses items et ceux des categories sous-adjacentes.
    J'ai eu l'idée de rajouter les colonnes "rgt" et "lft" à ma table Item, ces dernières couplé avec "rgt" et "lft" de la table Category.
    et de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Category extends BaseCategory
    {
     
    	public function getItems()
    	{
    		 $q = Doctrine_Query::create()
    		->from('Item i')
    		->where('i.lft BETWEEN ? AND ?', array($this->getLft(), $this->getRgt())
     
    		return $q->execute();
    	}
    }
    Cette methode est-elle bonne oubien il y a t-il une meilleure?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    Pour info je n'arrive pas à faire les liaisons foreign key entre les tables Category et Item sur les colonnes lft et rgt...
    J'effectue la liaison en initialisant la colonne lft.item avec la valeur de lft.category en surchargeant la méthode save() de la classe du modèle.

  3. #3
    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
    Ce ne serait pas un truc dans le genre ...

    La requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $q = Doctrine_Query::create()
        ->from('Category c')
        ->leftJoin('c.Items i');
    Récupérer l'arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $treeObject = Doctrine_Core::getTable('Category')->getTree();
    Y joindre la requête et récupérer les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $treeObject->setBaseQuery($q);
    $tree = $treeObject->fetchTree();
    Ensuite, tu te déplace dans $tree avec les méthodes dédiées aux arbres.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    merci, mais j'ai réussi en utilisant la méthode du parcours d'arbre.
    voir le lien (très intéressant):
    http://articles.sitepoint.com/articl...ata-database/2

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut
    ha ben si tu as réussis tant mieux
    je vais bientot utiliser ça aussi, si jamais tu as envie de me passer ton code sf...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/10/2008, 12h04
  2. Réponses: 6
    Dernier message: 10/10/2007, 12h28
  3. Réponses: 2
    Dernier message: 20/08/2007, 09h22
  4. Réponses: 7
    Dernier message: 05/04/2007, 16h15

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