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 :

[Symfony2/Doctrine] Query Builder d'un ManyToMany [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut [Symfony2/Doctrine] Query Builder d'un ManyToMany
    Bonjour à tous !

    Je me tourne vers vous car je suis sur un soucis de conception depuis ce matin et malgré des recherches une parties de la journée, je ne trouve pas comment résoudre mon problème

    Je développe actuellement un projet sur Symfony2 et je doit résoudre un problème conceptuel. Dans ce projet, j'utilise 2 entités, Host et Documentation, avec les règles suivantes :

    - Un host peut avoir un ou plusieurs documents associés

    - Un document peut documenter un ou plusieurs hosts

    J'en déduis cette cardinalité : Host (0,n) <===> (0,n) Documentation

    Une fois sur Symfony2 et Doctrine, j'utilise donc 2 entités éponymes et choisit donc une relation ManyToMany entre ces 2 entités. Comme attendu, 3 tables sont créer en BdD : Host, Documentation et host_documentation.

    Jusque là, aucun soucis, tout est comme voulu !

    Au niveau de mon repository, je commence une fonction qui aurait pu paraître anodine : récupérer la liste des documents qui n'est associé à aucun host. et là, c'est le drame !! Je ne trouve pas de solution 'miracle' ou claire. Alors je me retourne vers vous !

    Petite précision technique supplémentaire, je travail avec le QueryBuilder et toutes les fonctions qui vont avec (select(), from(),..)

  2. #2
    Membre habitué Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Points : 149
    Points
    149
    Par défaut
    Si une doc n'a pas d'host, elle n'est pas dans la table de jointure, donc la requete doit être de ce type :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from documentation where id not in (
        select distinct documentation_id from host_documentation
    )

    Ce lien devrait t'aider à faire ça avec le query builder : http://stackoverflow.com/questions/1...-query-builder
    Javascript est la pornstar des langages de programmation : souple, puissant, tu lui fais faire ce que tu veux, et ça peut finir bien crade.
    ---
    https://www.bgaze.fr

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse, je test ça en rentrant en début d'aprèm

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Bon, ta solution semble bonne mais mes lacunes en SQL et en Doctrine me freinent

    J'ai changer les noms entre temps de mes entités pour un besoin n'ayant aucun lien avec mon problème.
    L'entité host devient 'si' et l'entité Documentation devient 'Doc'. 'SiDoc' est la table de jointure.

    J'en suis à ce point :
    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
    // Création du requêteur
    $qb = $this->_em->createQueryBuilder();
     
    // Traitement de la requete 'SELECT DISTINCT Doc_id FROM SiDoc'
    $nots= $qb->select('sd')
               ->from('DocusSiBundle:SiDoc', 'sd')
               ->groupBy('sd.doc')
               ->getQuery()
               ->getResult();
     
    // SELECT * FROM Doc WHERE id NOT IN nots
    $linked = $qb->select('d')
           	 ->from('DocusSiBundle:Doc', 'd')
    	 ->where($qb->expr()->notIn('d.id', $nots))
             ->getQuery()
             ->getResult();
    Visiblement, la première partie de la requete ($nots) sort un résultat. Cependant, une erreur apparaît lors de la seconde requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Catchable Fatal Error: Object of class Docus\SiBundle\Entity\SiDoc could not be converted to string in
    /Users/Torrent007/www/DocUs/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Expr.php line 568
    Cette erreur vient surement du fait que $nots est un objet (ou tableau d'objet? je ne trouve pas si c'est l'un ou l'autre ) et qu'il faut un string à la fonction notIn. cependant, je suis perdu sur comment faire la conversion ou récupérer uniquement la valeur à comparer.

    I need your help again please !!

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Problème résolu !

    Je poste ici la réponse complète que j'ai trouvé, si cela peut aider d'autre utilisateur :
    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
    /**
     * INFO: La requete SQL est la suivante : 
     * 
     * SELECT * FROM Doc WHERE id NOT IN (
     *     SELECT DISTINCT doc_id FROM SiDoc
     * )
     **/
     
    // Création du requêteur
    $qb = $this->_em->createQueryBuilder();
     
    // SELECT DISTINCT Doc_id FROM SiDoc
    $nots = $qb->select('IDENTITY(s.doc)')
    		   ->from('DocusSiBundle:SiDoc', 's')
    		   ->groupBy('s.doc')
    		   ->getQuery()
    		   ->getResult();
     
    // Mise en forme du tableau en sortie
    // Actuel   : $nots = array(array(1), array(2), ...)
    // Objectif : $tab  = array(1,2,...)
    foreach($nots as $value)
        $tab[] = $value[1];
     
    // SELECT * FROM Doc WHERE id NOT IN nots
    $linked = $qb->select('d')
        		 ->from('DocusSiBundle:Doc', 'd')
        		 ->where($qb->expr()->notIn('d.id', $tab))
        		 ->getQuery()
        		 ->getResult();
     
    // Renvoie du résultat
    return $linked;
    Un gros merci à Soobook pour la requête SQL et le lien vers un exemple de plein de bon sens
    Merci à tous ceux qui ont pris le temps de lire mon soucis également !!

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

Discussions similaires

  1. ManyToMany avec attributs et join dans query builder
    Par ptitcodeur dans le forum Doctrine2
    Réponses: 2
    Dernier message: 07/05/2013, 16h13
  2. Réponses: 2
    Dernier message: 05/07/2007, 12h39
  3. Réponses: 3
    Dernier message: 20/06/2007, 14h31
  4. Réponses: 2
    Dernier message: 04/06/2007, 16h38
  5. Comment configurer active query builder
    Par davos56 dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/04/2007, 07h38

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