Fork me on GitHub

Rapport de message :*
 

Re: Faire un Join avec XoopsObject

Titre du sujet : Re: Faire un Join avec XoopsObject
par JJDai sur 05/01/2022 13:52:53

Bonjour,
Plusieurs solutions s'offrent à toi:

1 - faire deux requêtes une sur chaque table et les demander en tableau avec l'id comme clé associative, puis boucler sur la table maitre en affectant une nouvelle entrée au tablau en utilisant idElement de la table maitre sur le tableau des éléments.
Perso c'est souvent comme ça que je pratique car au passage ça permet de faire d'autres traitements sur le tableau de la table maitre, comme une transformation d'un timestamp en date lisible, ou une autre table enfant,n ...

2 - Utiliser l'objet xoopsObjectHandler (pas sur du nom mais ça doit y ressembler) qui permet si je me souviens bien de faire un lien sur autre table.Je n'utilise que très rarement cette solution, je préfère nettement la construction de requêtes SQL plus souple, plus riche en fonctionnalités, et pour moi plus facile à relire et décrypter.

3 - requête SQL simple:
SELECT tm.*, te.libelle  
FROM tableMaitre tm
tableEnfant te
WHERE tm
.idMaitre te.idMaitre


J'ai utilisé des alias qui permettent une plus grande souplesse dans la construction de la requête.

4 - requête SQL plus conforme:
SELECT tm.*, te.libelle  
FROM tableMaitre tm
LEFT JOIN tableEnfant te ON tm
.idMaitre te.idMaitre


La aussi J'ai utilisé des alias qui permettent une plus grande souplesse dans la construction de la requête.
C'est la méthode que je privilégie en général.

5 - Créer une requete en tutilisant l'exemple précédent, un truc du genre :
CREATE VIEW maReqsuete AS
SELECT tm.*, te.libelle  
FROM tableMaitre tm
LEFT JOIN tableEnfant te ON tm
.idMaitre te.idMaitre


Puis faire un select sur "maRequete".
L'avantage de cette méthode est que la requête est crée une fois pour toute.
Important :
- ne pas oublié de préfixer avec le même préfixe utilisé lors de l'installation de xoops (ex : x25bd_maRequetes") bien sur si il n'a pas été changé entre temps.
- Attention les noms de champs et de table sont sensible à la casse.

C'est la solution que j'utilise quand j'ai des requêtes complexes avec plus de deux tables, des concaténation de champs , ....

Il y a d'autre solutions, mais qui rentre vraiment dans des cas particulier. Par exemple afin d'optimiser l'affichage, l'ajout d'un champs "element_libelle" dans la table maitre, et avoir une requête de mise à jour de la table enfant sur la table maitre. Mais c'est une solution a utiliser avec précaution.

Un dernier point important, il faut s'assurer dans tous les cas qu'il y a bien un index sur le champ "idMaitre" de la table enfant et dans l'idéal sur les deux champs "idEnfant,idMaitre" de la table enfant.

J'espère avoir été assez clair, mais ne connaissant pas la structure de tes tables difficile de faire mieux, et quand tu aura fait le choix de la méthode, je pourrais rentrer dans le détail.
JJDai
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

115 Personne(s) en ligne (55 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 115 | Plus ...