Carnet Wiki

Jointures : spécifier le type de join ou un alias

Version 4 — 1 month ago JLuc

Auteur : John Livingston
Source : https://code.globenet.org/attacfr/campagnodon/-/commit/d2b516b1e3e05fc4598973ae037cf868843b736d
Autre réf : ticket https://git.spip.net/spip/spip/issues/5203#issuecomment-37646 + PR https://git.spip.net/spip/spip/pulls/5205
Sujets : jointures , créer un critère , créer une balise , left join , alias , champ homonymes

Challenge

Les 2 tables CAMPAGNODON_TRANSACTIONS et transactions
ont toutes 2 un champ `mode`.
Dans une jointure <BOUCLE_liste_campagnodon_transactions(CAMPAGNODON_TRANSACTIONS transactions) on ne peut accéder qu’au #MODE de la 1ère table : CAMPAGNODON_TRANSACTIONS

De plus, on souhaite que la jointure soit de type LEFT JOIN alors que SPIP fait par défaut des INNER JOIN.

Soluce

On y parvient au moyen du critère suivant, qui déclare la jointure au lieu que ça soit la boucle, la déclare de type LEFT JOIN et crée un alias sur le champ. La balise qui suit permet ensuite d’y accéder.

function critere_campagnodon_jointure_transactions_dist($idb, &$boucles, $crit) {
  $boucle = &$boucles[$idb];
  $boucle->from['transactions'] = 'spip_transactions';
  $boucle->from_type['transactions'] = 'LEFT';
  // le format de join est :
  // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
  $boucle->join['transactions'] = array("'campagnodon_transactions'", "'id_transaction'", "'id_transaction'");
  $boucle->select[] = 'transactions.mode AS transaction_mode'; // ce champ a un homonyme dans campagnodon_transactions, on contourne.
}
 
 
function balise_TRANSACTION_MODE_dist($p) {
    return rindex_pile($p, 'transaction_mode', 'campagnodon_jointure_transactions');
}

Usage

<BOUCLE_liste_campagnodon_transactions(CAMPAGNODON_TRANSACTIONS)
    {campagnodon_jointure_transactions}
    {statut_synchronisation?=#ENV{statut_synchronisation}}
    {tri #ENV{par,id_campagnodon_transaction},#GET{defaut_tri}}
    {pagination #ENV{nb,10}}
            title="<:info_numero_abbreviation|attribut_html:> #ID_TRANSACTION">#ID_TRANSACTION</a>
        </td>
        <td class="statut">[(#STATUT|match{echec|ok|rembourse}|et{#MESSAGE|trim|strlen}|?{[<abbr title="[(#MESSAGE|attribut_html)[ - (#ERREUR|attribut_html)]]">(#STATUT)</abbr>],#STATUT})]</td>
        <td class="transaction_mode">[(#TRANSACTION_MODE|bank_afficher_mode)]</td>
        <td class="montant">[(#MONTANT|bank_affiche_montant)]</td>
        <td class="mode">#MODE</td>
...
</BOUCLE_liste_campagnodon_transactions>