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 :

Nested Set Behavior


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut Nested Set Behavior
    Bonjour,

    J'ai besoin, pour stocker des opérations, d'utiliser le behavior Doctrine : NestedSet. Mais je rencontre deux problèmes.

    Le premier, est la méthodologie pour stocker des objets et enregistrer leurs relations hiérarchiques. J'ai beau utiliser des :
    • insertAsLastChildOf
    • insertNextSiblingOf
    • etc.

    je n'obtiens jamais quelque chose de très correct. Par exemple, pour stocker l'opération : 3 * (1 + 2), il faut que je déclare les éléments à l'envers :
    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
     
        /**
         * Sets the hierarchy for 3*(1+2):
         *  - *
         *  - - 3
         *  - - +
         *  - - - 1
         *  - - - 2
         *  
         *  @return nothing
         */
        function setConstraintHierarchy()
        {
            Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
            $this->plus->getNode()->insertAsLastChildOf($this->mult);
            $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
            $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
            $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
     
        }
    alors que je souhaiterais plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        function setConstraintHierarchy()
        {
            Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
            $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
            $this->plus->getNode()->insertAsLastChildOf($this->mult);
            $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
            $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
        }

    L'autre problème me vient de l'utilisation de la méthode getChildren. Dans mon cas d'utilisation, je veux récupérer l'ensemble des enfants d'un noeud et afficher leur valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public function __toString()
        {
            $value = $this->getValue();
     
            if ($children = $this->getNode()->getChildren()) {
                foreach ($children as $constraint) {
                    $value .= $constraint->__toString();
                }
            }
     
            return $value;
        }
    Or, ce code ne marche pas en l'état, avec l'initialisation précédente, mais marche si j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        function setConstraintHierarchy()
        {
            Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
            $this->plus->getNode()->insertAsLastChildOf($this->mult);
            $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
            $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
            $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
            
            $treeObject = Doctrine_Core::getTable('PocConstraint')->getTree();
            $tree = $treeObject->fetchTree();
        }
    Je ne comprends pas du tout l'utilité d'ajouter le fetchTree à un objet que je n'utilise même pas ...

    Si quelqu'un avait des idées, merci !!

  2. #2
    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
    Le message est passé a la trappe.

    Je crains que le nombre de spécialiste, ici, ne soit très limité sur ce behavior.

    A part si le code (que je n'ai pas inspecté) du fechTree fait des écritures sur la base, ne je vois pas. Sauf à considérer qu'il forcerait l'écriture d'un éventuel cache, mais alors, pourquoi ta lecture ne le ferait-il pas aussi ?

    D'autant que j'avoue ne pas bien comprendre le code que tu utilises, ni l'intérêt d'utiliser une structure de bdd pour stocker ceci.

    Est-ce que parser une chaine : "3 * ( 1 + 2 )" ne serait pas plus simple à stocker et gérer ?

    Dans le pire des cas, créer un environnement d'objets "emboitables" et sérialisable pour ne stocker que la partie sérialisée ?

    J'ai un peu l'impression d'avoir vu passer un boulet au dessus de la tête d'une mouche décoiffée

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Bonjour Michel,

    Merci d'avoir pris le temps de répondre

    A part si le code (que je n'ai pas inspecté) du fechTree fait des écritures sur la base, ne je vois pas. Sauf à considérer qu'il forcerait l'écriture d'un éventuel cache
    Ayant eu il y a quelques jours (sur un tout autre sujet que les NestedSet) un problème similaire à ce que tu évoques (la gestion du cache), il est bien possible que cela vienne de quelque part par là.

    En ce qui concerne l'intérêt, le code proposé ici n'est qu'une méthode pour une série de tests unitaires. Ce que je cherche à stocker n'est pas une expression du type 1+(2*3) mais une hiérarchie entre objets métiers.

    Bien que ce soit le premier problème le plus bloquant, merci de la piste pour le second !! J'ai tendance à croire que la vérité se trouve là

  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
    Je te laisse mener les recherches, sur que tu nous fera part de tes conclusions.

    Et tant pis pour la mouche on va lui acheter un peigne

  5. #5
    Membre actif

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Points : 220
    Points
    220
    Par défaut
    L'intérêt du behavior est de simplifier les requêtes sur structure hiérarchique.

    Pour que ceci fonctionne correctement notamment ton problème de getChildren() il faut hydrader les objets hiérarchiquement, via Doctrine_Core::HYDRATE_HIERARCHY ou fetchTree() plus directement.

    Ensuite pour tes problèmes d'insertions à l'envers, il faut bien comprendre comment fonctionne la structure d'un arbre SQL, pour ca je te conseille de lire cet article
    http://sqlpro.developpez.com/cours/arborescence/

Discussions similaires

  1. [Doctrine] Comment bouger les noeud avec les Nested Set
    Par beachjf dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 10/02/2011, 22h31
  2. Réponses: 10
    Dernier message: 26/08/2010, 02h11
  3. Réponses: 1
    Dernier message: 23/08/2010, 12h10
  4. Nested set - Treeview
    Par Erakis dans le forum ASP.NET
    Réponses: 6
    Dernier message: 28/07/2010, 19h54
  5. [1.x] Nested set avec jointure
    Par damiensan dans le forum Symfony
    Réponses: 4
    Dernier message: 21/05/2010, 15h21

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