[RESOLU] récupération entité avec liaison many to many

Eléphant du PHP | 82 Messages

05 juin 2013, 15:41

Bonjour à vous !

J'ai actuellement une table document qui comprend plusieurs liaisons avec d'autre table. Elle est liée en many to many avec la table domain (avec une table intermédiaire donc), car un document peut avoir plusieurs domaines. (pas important : La table domain est traduite, elle comprend donc une liaison à une table de traduction). Document est aussi lié en many to many à la table file (avec une table intermédiaire aussi), car un document peut avoir plusieurs fichiers.

Lorsque je veux récupérer tous les documents, je veux aussi récupérer tous leur(s) domaine(s) ainsi que tous leur(s) file(s) :

Voici la requete que j'ai fait :
Select v2_document.title, v2_domain_lang.name As domain_name, v2_file.name AS file_name
From v2_document
Left join v2_domain_document on v2_document.id = v2_domain_document.id_document
Left join v2_domain on v2_domain_document.id_domain = v2_domain.id
Left join v2_domain_lang ON v2_domain.id = v2_domain_lang.reference
Left join v2_language ON v2_domain_lang.language = v2_language.id
Left join v2_file_document on v2_document.id = v2_file_document.id_document
Left join v2_file on v2_file_document.id_file = v2_file.id
Where v2_language.id = 1
Le document à pour titre : titre1
Il a comme domaine : asdfsadf, as dfsdaf et aSDasd
et ces files sont : symfony4.doc, symfony3.doc et symfony2.doc

Code : Tout sélectionner

title domain_name file_name titre1 asdfsadf symfony4.doc titre1 as dfsdaf symfony4.doc titre1 aSDasd symfony4.doc titre1 asDASd symfony4.doc titre1 asdfsadf symfony3.doc titre1 as dfsdaf symfony3.doc titre1 aSDasd symfony3.doc titre1 asDASd symfony3.doc titre1 asdfsadf symfony2.doc titre1 as dfsdaf symfony2.doc titre1 aSDasd symfony2.doc titre1 asDASd symfony2.doc
Cette requête me sort effectivement tout ce que je veux, mais pour un document, elle me sort (nbre de domain * nbre de file) champs...

Comment je peux faire au mieux (le moins gourmand et le plus rapide possible) pour avoir au final un tableau de ce type par document. Ceci est un exemple :
<?php
array(title = 'titre1', domain_name => array('domain1', 'domain2', 'domain3', 'domain4'), 'file_name' => array(symfony2.doc, symfony3.doc, symfony4.com);
Merci d'avance pour votre réponse !

Tex.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 juin 2013, 21:26

salut,


pourquoi les left ?

si tu as un modèle et que tu ne souhaite que les infos existantes tu n'a pas besoin des left, et c'est surement pour cela que tu a un produit cartésien.


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

06 juin 2013, 00:42

Salut,

Je suis désolé je ne comprends pas bien ta question. Je fais les LEFT JOIN car je souhaite avoir tous les documents de la tables ainsi que leur domaine et fichier respectif. Donc pour avoir cela je dois faire des liaisons avec des jointures non ?

Eléphant du PHP | 82 Messages

06 juin 2013, 12:22

C'est bon j'ai trouvé merci :
SELECT v2_document.title, GROUP_CONCAT(DISTINCT CONCAT(v2_domain.id, ' ',v2_domain_lang.name)) AS domain_name, GROUP_CONCAT(DISTINCT CAST(v2_file.name AS CHAR)) AS file_name
FROM v2_document
LEFT JOIN v2_domain_document ON v2_document.id = v2_domain_document.id_document
LEFT JOIN v2_domain ON v2_domain_document.id_domain = v2_domain.id
LEFT JOIN v2_domain_lang ON v2_domain.id = v2_domain_lang.reference
LEFT JOIN v2_language ON v2_domain_lang.LANGUAGE = v2_language.id
LEFT JOIN v2_file_document ON v2_document.id = v2_file_document.id_document
LEFT JOIN v2_file ON v2_file_document.id_file = v2_file.id
WHERE v2_language.id = 1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 juin 2013, 19:30

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.
Il en faut peu pour être heureux ......