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

PHP & Base de données Discussion :

[Doctrine] Tri sur les enfants


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut [Doctrine] Tri sur les enfants
    Bonjour,

    en fait c'est très simple, je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $pages = Doctrine_Query::create()
                    ->select('p.id, p.nom')
                    ->from('Page p')
                    ->where('p.parentId IS NULL')
                    ->orderBy('p.position')
                    ->execute();
    et un objet page est définit comme cela (donc il a n enfants possibles qui sont aussi des pages) :

    Code YAML : 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
    Page:
      columns:
        id:
          primary: true
          type: integer(4)
          autoincrement: true
        nom:
          notnull: true
          type: string(200)
        position:
          notnull: true
          type: integer(4)
        parentId:
          notnull: false
     
      relations:
        Page:
          local: id
          foreign: parentId
          foreignType: one
          type: many

    la requête marche,pas de problème, sauf que l'order by position ne se fait que sur les pages parentes, pas les pages enfants...

    comment faire pour que lorsque Doctrine hydrate ses pages enfants, elle les order by ?

  2. #2
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Salut,

    C'est normal, si tu sélectionnes tes pages parents.

    Pour les données hériarchiques, je te conseille d'utiliser le NstedSet avec Doctrine.

    A+

    Mathieu

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    Salut, merci pour ta réponse, mais qu'est ce que le 'NstedSet' ? Je n'en ai jamais entendu parler...

  4. #4
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Salut

    Pardon, j'ai fait une faute de frappe, il s'agit de la gestion des données hiérarchiques avec l'ORM Doctrine : le "NestedSet".

    C'est en fait un actAs, cela va te permettre de faire une sorte de Treeview (c'est un behavior de Doctrine, tel que timestampable).

    Pour faire simple, tu insère dans ton shéma un actAs : NestedSet, et Doctrine va ajouter trois ou quatre champs a ta table : "root_id", "lft", "rgt" ainsi que "level".

    Pour plus d'infos :

    http://www.doctrine-project.org/docu...rarchical-data

    A+

    Mathieu

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    merci !

    J'ai testé ca marche bien pour l'affichage d'un arbre, mais je n'ai pas trouver comment update l'arbre en entier ? (évidemment sans le détruire entièrement et le recréer)

    Si tu as une expérience sur ce sujet je suis intéressé

  6. #6
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Salut,

    Tu as plusieurs méthodes, qui sont répertoriées dans le lien que j'ai précédemment envoyé.

    Je ne sais pas ce que tu veux réaliser exactement...

    Plusieurs méthodes sont disponibles, voici la mécanique basique (tiré du lien que je t'ai envoyé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $category = new Category();
    $category->name = 'Root Category 2';
    $category->save();
     
    $categoryTable = Doctrine::getTable('Category');
     
    $treeObject = $categoryTable->getTree();
    $treeObject->createRoot($category);
     
    $childCategory = $categoryTable->findOneByName('Child Category 1');
    $childCategory->getNode()->moveAsLastChildOf($category);
    Je te conseille ce lien :

    http://redotheoffice.com/?tag=doctri...fony-nestedset

    Sinon, donnes moi plus d'explications sur ce que tu souhaites réaliser, et si j'ai les compétences pour t'aider, je le ferais avec plaisir...

    A+

    Mathieu

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    oui j'avais déjà vu mais pour sauvegarder un arbre entièrement avec une liste d'id, exemple d'un arbre déjà dans la base :
    3
    1
    2
    4

    si j'intervertis 2 et 1 et que je veux sauvegarder la séquence.

    Comment faire sachant que je ne veux pas détruire l'arbre avant de le reconstruire ? (et que je sauvegarde l'état de l'arbre en entier).

  8. #8
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    D'abord, il faut que tu récupère ton arbre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $pageTable = Doctrine::getTable('Page');
    $tree = $pageTable->getTree();
    Ensuite, tu peux récupérer un nœud comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $node = $pageTable->find(ton_id_de_base)->getNode();
    $nodeToMove = $pageTable->find(ton_id_a_bouger)->getNode();
    Pour finir, tu peux bouger tes nœuds comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $node->moveAsPrevSiblingOf($nodeToMove);
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $node->moveAsNextSiblingOf($nodeToMove);
    J'espère t'avoir aidé...

    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Par défaut
    merci pour tout, j'ai trouvé les réponses que je cherchais ici :
    http://mpp.selfip.com/blog/doctrine-les-nested-set.html

Discussions similaires

  1. [struts]: Pagination et tri sur les colonnes
    Par sleepy2002 dans le forum Struts 1
    Réponses: 3
    Dernier message: 09/07/2007, 15h16
  2. Tri sur les listes
    Par frizou11 dans le forum Général Python
    Réponses: 4
    Dernier message: 14/05/2006, 11h33
  3. [MySQL] Tri sur les champs
    Par Pias dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 14/04/2006, 08h56
  4. Tri sur les champs
    Par Pias dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/04/2006, 17h14
  5. Réponses: 12
    Dernier message: 31/03/2006, 20h02

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