Fork me on GitHub






Faire un Join avec XoopsObject
Aspirant
Inscrit: 28/11/2021 22:07
Messages: 30
Bonjour,

J'ai une table éléments et ils ont un statut, dont le libellé est dans une autre table.
Je voudrais lister ces éléments et afficher le libellé du status sans avoir à faire une requête $stts->get($idStt); à chaque boucle du foreach (car ça fait une requête à chaque fois).

Le plus simple je pense est de faire un Join dans ma classe Element afin de l'avoir directement dans ma requête ->getAll()
Mais je ne sais pas comment faire.


Posté le : 05/01 11:52
Partager Twitter Partagez cette article sur GG+
Re: Faire un Join avec XoopsObject
Admin Frxoops
Inscrit: 04/03/2011 09:10
De Lot
Messages: 2740
perso, moins j'utilise directement la class xoopsDB pour certaines requêtes SQL complexes.

Posté le : 05/01 12:43
Partager Twitter Partagez cette article sur GG+
Re: Faire un Join avec XoopsObject
Team FrXoops
Inscrit: 14/05/2004 22:32
Messages: 2493
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

Posté le : 05/01 13:52

Ne pas perdre patience, même si cela semble impossible, c'est déjà de la patience.
Origami
Conseil des Sages
Sur gitHub
Partager Twitter Partagez cette article sur GG+
Re: Faire un Join avec XoopsObject
Aspirant
Inscrit: 28/11/2021 22:07
Messages: 30
Bonjour JJDai et montuy,

Merci pour vos retours, désolé du temps de réponse, je m'attendais à être notifié par mail mais je ne l'ai pas été.
(je viens d'aller éditer le moyen de notif dans mon profil)

En effet, je me suis tourné vers la solution du mappage d'objects (ajouter des clés dans le foreach de mon objet de base).

En effet, pour la requête dédiée, il faut faire un objet dédié j'imagine (ou ajouter des propriétés de l'autre table dans l'objet de base, qui ne seront pas toujours renseignées si on passe par le GetAll()).

Posté le : 09/02 10:39
Partager Twitter Partagez cette article sur GG+

 Haut   Précédent   Suivant




Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

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