Categories > TinyButStrong general (FR) >

[fr] Jointure entre 2 tables

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: PatrikGC
Date: 2012-01-19
Time: 19:13

[fr] Jointure entre 2 tables

Bonjour et Bonne Année :)

J'ai cherché dans le forum avec le mot "jointure" mais je n'ai pas trouvé de solution.

Je fais une requête : SELECT * FROM table1,table2 WHERE table1.idt=table2.champ1
SQLite me retourne des champs du style : table1.champ1,table1.champ2 etc...
Bien que tous mes champs aient des noms distincts.
Donc dans le template, je dois donc écrire [bloc1.table1.champ1]
Et ça ne fonctionne pas, un msg m'indique qu'il ne connait pas table1

Quelqu'un aurait-il une solution autre que de renommer les champs dans la requête ?
Merci d'avance
By: Skrol29
Date: 2012-01-19
Time: 22:46

Re: Jointure entre 2 tables

Effectivement, le point (.) est un séparateur d'item pour TBS.

La solution c'est d'utiliser une requête explicite. Le * étant de toute façon une mauvaise pratique.
SELECT champ1, champ2 FROM table1 ,table2 WHERE table1.idt=table2.champ1
ou sinon des alias de champ :
SELECT champ1 AS champ1, champ2 AS champ2 FROM table1 ,table2 WHERE table1.idt=table2.champ1
By: PatrikGC
Date: 2012-01-20
Time: 09:04

Re: Jointure entre 2 tables

C'est bien ce que je pensais, mais ça va me fait une looooooooooooooooooongue requête...
TBS est un bon moteur de templates, simple et efficace, que lui demander de plus ?
Ah si : la gestion du . entre table et champ :)

Merci pour la rapide réponse :)
By: PatrikGC
Date: 2012-01-23
Time: 20:07

Re: Jointure entre 2 tables

Bonsoir

Serait-il possible d'avoir une option qui :
- supprime le nom de la table : table1.champ1 --> champ1
- remplace le . qui sépare la table du champ par un autre caractère : table1.champ1 --> table1_champ1

Sinon, je peux tenter de faire la modif dans la classe elle-même, car ça m'embête de réécrire toutes mes requêtes avec des AS dedans...

Bonne soirée :)
By: Skrol29
Date: 2012-01-23
Time: 23:17

Re: Jointure entre 2 tables

Bonsoir,

Je ne suis pas trop pour ajouter une telle option pour deux raisons :
Ça soutient une mauvaise pratique du code SQL, et tout toute façon les noms de colonnes avec des points (.) poseront aussi les mêmes problème avec PHP pour les fetch sous forme d'objet.

Par contre tu peux t'en sortir avec quelques astuces :

Solution 1 :

Tu utilises le paramètre "ondata" sur le  bloc fusionné pour appeler une fonction PHP qui renommera toutes les colonnes une à une.
HTML:
[bloc1.table1_champ1;block=tr;ondata=f_rename]
PHP:
function f_rename ($Block, &CurrRec, $RecNum) {
  foreach($CurrRec as $col => $val) {
    $CurrRec[str_replace('.', '_', $col)] =& $CurrRec[$col];
  }
}

Solution 2 :

Tu codes une fonction PHP qui commence par récupérer les colonnes de ta requête en "SELECT *".
Puis elle se sert de cette liste de colonne pour établir la liste des colonnes avec leur alias : "table1.champ1 AS champ1", "table2.champ2 AS champ2", ...
Et tu finis en remplaçant le * du SELECT par la liste des colonnes avec alias.

Cette fonction remplace donc une requête "*" en requête explicite.
By: PatrikGC
Date: 2012-01-28
Time: 11:14

Re: Jointure entre 2 tables

Bonjour

Merci pour ces infos que je vais mettre en pratique tt de suite.
J'incline pour la 1ère solution qui me semble + propre.

Merci encore :)

---EDIT---

Une petite erreur de frappe à rectifier : function f_rename ($Block, &$CurrRec, $RecNum) {
Un $ avant le paramètre CurrRec
Sinon, j'ai arrangé à ma sauce en supprimant purement le nom de la table :
function TBSData ($Block, &$CurrRec, $RecNum) {
  foreach($CurrRec as $col => $val) {
    $pos=strpos($col,'.');
    if($pos) $CurrRec[substr($col,$pos+1)]=& $CurrRec[$col];
  }
}
J'aurais pu passer par une RegExp, mais j'ai fait + simpliste :)