Carnet Wiki

Catalogue des jointures utilisées

Version 11 — Mai 2022 JLuc

Il y a quelques exemples de jointures dans des boucles SPIP dans la doc de spip.net-> https://www.spip.net/fr_article4254.html]

- Cette page présente l’entier éventail des jointures à 2 ou 3 tables de SPIP, trouvées dans le ( noyau et dans les plugin dist, ) et les jointures à 3 tables trouvées dans les plugins de la zone.- Cette page ne montre QUE le tag de la boucle, avec les tables explicitées et les critères. Mais il se peut que les derniers perfectionnements du compilateur prennent aussi en compte les balises utilisées dans la boucle, auquel cas pour bien comprendre ce qu’il se passe, il faudrait compléter ces citations par la liste des balises utilisées.
- Il y a déjà aussi des exemples dans la doc de spip.net : https://www.spip.net/fr_article4254.html

Cette page ne montre QUE le tag de la boucle, avec les tables explicitées et les critères.

Il se peut cependant que le compilateur prenne aussi en compte les balises utilisées dans la boucle, même si la table dont elles font partie n’est pas explicitement référencée dans la boucle. Pour bien comprendre ce qu’il se passe dans ce cas, il faut chercher 1) dans le source du squelette la liste des balises utilisées dans le corps de la boucle et 2) dans le source de SPIP pour y trouver la déclaration des jointures automatiques.

Perle

Une jointure avec une seule table spécifiée et 2 autres tables dans les critères plus les tables de liaisons intermédiaires qui n’ont pas besoin non plus d’être explicitées dans le code spip :

Ici dans sa version originale avec le plugin article_accueil, pour sélectionner tous les articles d’accueil qui ont un document PDF lié dans certaines rubriques :

<BOUCLE_avec_pdf(ARTICLES)
    {article_accueil}
    {rubriques.id_parent = 3}
    {documents.extension = pdf}
    {!par date}
>

Ici dans une version à tester, sans le plugin article_accueil, pour sélectionner tous les articles qui ont un document PDF lié dans certaines rubriques

<BOUCLE_avec_pdf(ARTICLES)
    {rubriques.id_parent = 3}
    {documents.extension = pdf}
    {!par date}
>

Jointures à 3 tables dans SPIP

Dans SPIP 4 et les plugins dist, on trouve 8 occurrences d’une jointure explicite à 3 tables : 7 font la même jointure du document vers la table des types de documents, et 1 tente une jointure des documents vers l’article courant.

Accéder au type d’un document

Par exemple dans modeles/document_case.html :

<BOUCLE_docslies(DOCUMENTS documents_liens types_documents){id_document}{id_objet}{objet}{statut?}>

Filtrer sur l’article auquel est associé un document

Dans squelettes-dist/inclure/documents.html ça marche plus bien avec SPIP 4 : https://git.spip.net/spip/dist/issues/4834

<BOUCLE_documents_decompte(DOCUMENTS spip_documents_liens articles) {id_article?}{objet?}{id_objet?} {media!=image} {texte=''} {vu=non}>

Jointures à 2 tables dans SPIP

Des documents vers leurs types
Ces mêmes liaisons se font aussi parfois avec 2 tables seulement.

Par exemple dans modeles/audio_emb.html :

<BOUCLE_ext(DOCUMENTS types_documents) {id_document=#ENV{id,#ENV{id_document}}} {tout}>

Des MESSAGES vers leurs auteurs

Dans organiseur on trouve une grande variété dans l’écriture des jointures : avec ou sans majuscules et en passant ou pas par la table de lien, mais toujours sans le préfixe ’spip_’.

Dans organiseur/prive/objets/liste/messages-recus.html :

<BOUCLE_compte_non_lus(MESSAGES auteurs){destinataire?#ENV{destinataire}}{id_auteur?}{type!=pb}{type?}{where?}{statut?}{recherche?}{non_lu}>[(#NOM|vide)]</BOUCLE_compte_non_lus>

Dans organiseur/prive/rss on trouve

<BOUCLE_A(messages auteurs_liens){doublons M}{auteurs_liens.id_auteur}>

mais aussitôt après :

<BOUCLE_RSS(messages auteurs){!par date_heure}{!doublons M}{0,10}>

puis

<BOUCLE_message_rv(messages auteurs_messages){lang_select=non}{par date_heure}{inverse}{statut="publie"}{rv=oui}{auteurs_messages.id_auteur=#ID_AUTEUR}>

On trouve aussi plusieurs occurrences de cette dernière jointure dans
spip/prive/ical_prive.html, qui inverse l’ordre d’apparition des tables :

<BOUCLE_message_n_a(AUTEURS auteurs_messages){lang_select=non}{id_message}>

Modifications opérées par un auteur
Dans prive/rss/revisions.html :

<BOUCLE_RSS(VERSIONS auteurs){id_version >1}{!par date}{0,10}{id_secteur ?}{id_auteur ?}>marche

Liste de plugins

Dans svp/formulaires/inc-admin_plugin.html :

<BOUCLE_plugins(PAQUETS plugins){tout}{par multi nom, paquets.prefixe}{!par constante, actif}{id_depot=0}{actif ?}{constante ?IN #ENV{constante}}>

Dépot d’un plugins
Dans svp/prive/squelettes/hierarchie.html :

<BOUCLE_plugin(PLUGINS depots) {id_plugin}{0, 1}>

Jointures à 3 tables des plugins de la zone

La majorité des jointures sont là encore des jointures des documents vers documents_types. Je ne les reprends pas ici et ne liste que des jointures pas déjà vues et présentes dans des plugins un peu actifs.

Plugin coordonnées

<BOUCLE_add(ADRESSES adresses_liens auteurs){id_auteur}>
<BOUCLE_mail(EMAILS emails_liens auteurs){id_auteur=#ENV{id_auteur}}>
<BOUCLE_num(NUMEROS numeros_liens auteurs){id_auteur}>

Plugin emballe_medias_collections

Cette boucle a besoin d’une jointure explicite car elle a des critères sur les documents ?

<BOUCLE_medias_collection_ajouter(ARTICLES spip_documents_liens spip_documents){id_auteur=#SESSION{id_auteur}}{id_secteur?}{documents.media == #ENV{document_media,.*}}{!par maj}{pagination #ENV{pagination,9}}{doublons medias_ajoutes}>

Jointures à 3 tables des squelettes de la zone

Je ne liste que des jointures pas déjà vues. Il faudrait vérifier si les squelettes sont compatibles SPIP 4.

Sarkaspip

<BOUCLE_filtre_motscles(MOTS mots_articles articles){type != squelette_habillage}{articles.id_article > 0}{articles.id_rubrique==#BRANCHE_SPECIALISEE{agenda}}{fusion mots.titre}{par mots.titre}{pagination #CONFIG{sarkaspip_noisettes/pas_pagination_filtre, 10}}>

Collezion : MOTs vers ARTICLES
C’est dans une boucle GROUPE. Ça semble présenter des motclés, mais lesquels ?
De toute façon c’est pour un vieux SPIP.

<BOUCLE_mot(MOTS spip_mots_articles spip_articles) {articles.statut = publie} {fusion mots.id_mot}{id_groupe}>
 <li class="#GET{li}"><a href="#URL_MOT">#TITRE</a></li>
</BOUCLE_mot>

Erreurs et corrections de Jointures à 2 tables

Abonnements et commandes

La boucle <BOUCLE_commande(COMMANDES){id_abonnement}>
ne marchait pas car spip se trompait de jointure et utilisait auteurs_liens au lieu des commandes_liens. Ça donnait :

SELECT commandes.id_commande
FROM spip_commandes AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y29tbWFuZGVzPC9jb2RlPg=="></span>  
INNER JOIN spip_auteurs_liens AS L1 ON ( L1.id_auteur = commandes.id_auteur )
WHERE ((commandes.statut  IN ('encours','attente','partiel','paye','envoye','retour','retour_partiel')))
	AND (L1.id_objet = 90)
	AND (L1.objet = 'abonnement')
GROUP BY commandes.id_commande

Ce qui marchait bien c’était :

<BOUCLE_commande(commandes_liens abonnement){objet=abonnement}{id_abonnement}>

Il s’est avéré que c’était à cause de cette partie de la déclaration de la table commande dans le pipeline declarer_tables_objets_sql :

'tables_jointures' => 
  array('spip_commandes_liens'),
  'join' => array(
    'id_auteur' => 'id_auteur',
  ),...

Le problème disparaît ajoutant une déclaration de jointure sur la table elle-même, avec :

'join' => array(
  'id_commande' => 'id_commande',
  'id_auteur' => 'id_auteur',
),