SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

274 Plugins, 192 contribs sur SPIP-Zone, 93 visiteurs en ce moment

Accueil > Documentation > Tutoriaux pour le code de SPIP > Notes sur les jointures entre tables

Notes sur les jointures entre tables

15 avril 2011 – par severo – commentaires

Toutes les versions de cet article : [Español] [français]

14 votes

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Après avoir cherché à divers endroits des infos sur les jointures entre tables dans SPIP, je réunis ici quelques notes en vrac...

Critères : jointures automatiques

Comme l’explique bien l’article de Programmer

Lorsque dans une boucle il est demandé un critère qui n’appartient pas à la table de la boucle, SPIP essaie automatiquement de trouver une table liée qui contient le champ demandé.

Dans l’exemple donné, la jointure se fait automatiquement entre les tables spip_documents et spip_documents_liens à laquelle appartient le champ “vu” :

  1. <BOUCLE_doc(DOCUMENTS){0,10}{vu=oui}>
  2. - #FICHIER<br />
  3. </BOUCLE_doc>

Attention : la jointure automatique ne concerne que les critères, pas les balises : dans l’exemple ci-dessus, on ne pourrait pas utiliser #VU dans le corps de la boucle !

Critères : forcer une jointure

Dans l’exemple cité plus haut, on aurait pu forcer la jointure en spécifiant la table à utiliser, de la manière suivante :

  1. <BOUCLE_doc(DOCUMENTS){0,10}{documents_liens.vu=oui}>
  2. - #FICHIER<br />
  3. </BOUCLE_doc>

Une autre manière de faire, moins recommandée (moins générique, et nécessite une déclaration), est d’utiliser une exception de jointure. On la déclare par exemple dans le pipeline declarer_tables_interfaces par :

  1. $interface['exceptions_des_jointures']['vu_documents'] = array('spip_documents_liens', 'vu');

puis on l’utilise dans la boucle

  1. <BOUCLE_doc(DOCUMENTS){0,10}{vu_documents=oui}>
  2. - #FICHIER<br />
  3. </BOUCLE_doc>

Attention : dans ce cas également, la jointure ne fonctionne que pour les critères, pas les balises ! Voir par exemple http://permalink.gmane.org/gmane.comp.web.spip.devel/60476.

Balises : forcer la jointure

Pour utiliser les balises d’une autre table que la table de la boucle, il faut absolument forcer la jointure dans le squelette de manière explicite. Par exemple, pour afficher la valeur du champ vu grâce à la balise #VU :

  1. <BOUCLE_doc(DOCUMENTS spip_documents_liens){0,10}{vu=oui}>
  2. - #FICHIER (#VU)<br />
  3. </BOUCLE_doc>

Cette manière de forcer explicitement la jointure permet aussi de faire fonctionner le critère {vu=oui}.

Attention : la déclaration d’exception de jointure décrite plus haut ne sert pas à fabriquer de nouvelles balises. Dans l’exemple associé “vu_documents” n’est qu’un alias pour les critères !

Balises : champs homonymes

Dans le cas particulier où on veut afficher un champ de la table jointe ayant le même nom qu’un champ de la table de la boucle, il est nécessaire d’utiliser deux boucles. Par exemple, les tables spip_documents et spip_articles ont toutes les deux un champ titre. Dans une boucle de documents, pour afficher le nom du fichier et le titre de l’article associé, il faut faire :

  1. <BOUCLE_image(DOCUMENTS){id_article}>
  2. <BOUCLE_article(ARTICLES){id_article}>
  3. #_image:FICHIER - #_article:TITRE
  4. </BOUCLE_article>
  5. </BOUCLE_image>

ou plus simplement (à l’écriture, parce qu’une deuxième requête sera créée de toute manière) :

  1. <BOUCLE_image(DOCUMENTS){id_article}>
  2. #FICHIER - #INFO_TITRE{article, #ID_ARTICLE}
  3. </BOUCLE_image>

Pour information, la boucle suivante afficherait le titre du document, et pas de l’article

  1. <BOUCLE_image(DOCUMENTS){id_article}>
  2. #FICHIER - #TITRE
  3. </BOUCLE_image>

En effet, SPIP calcule une balise :

  • premièrement en cherchant le champ correspondant dans la table principale de la boucle où elle se trouve,
  • puis, si aucun champ n’est trouvé, dans les tables jointes.

A noter : dans SPIP, pour les balises, il n’existe pas de notation du type #articles.TITRE comme on pourrait le voir en SQL, ou comme on peut le faire pour les critères (voir plus haut).

Déclaration des jointures

Pour déclarer une jointure dans la déclaration d’une table, il faut que les champs de la jointure soient insérés :

  • dans 'key', qui liste les clés (primaire et autres),
  • ou dans 'join', qui liste les champs pour les jointures.

Par exemple, dans le pipeline trucs_declarer_tables_principales d’un objet appelé truc, le code suivant déclare id_truc comme clé primaire, ce qui permettra les jointures sur ce champ :

  1. $tables_principales['spip_trucs']['key'] = array("PRIMARY KEY" => "id_truc");

et le code suivant déclare que les deux champs id_auteur et id_traducteur de la table utiliseront le champ id_auteur de l’autre table en cas de jointure :

  1. $tables_principales['spip_trucs']['join'] = array("id_auteur" => "id_auteur", "id_traducteur" => "id_auteur");

A noter : ces mêmes déclarations peuvent être faites dans le fichier mes_options.php par :

  1. $GLOBALS['tables_principales']['spip_trucs']['key'] = array("PRIMARY KEY" => "id_truc");
  2. $GLOBALS['tables_principales']['spip_trucs']['join'] = array("id_auteur" => "id_auteur", "id_traducteur" => "id_auteur");

Quelques liens

Retour en haut de la page

Vos commentaires

  • Le 17 mai 2011 à 15:33, par Z En réponse à : Notes sur les jointures entre tables

    Merci Severo pour cette contrib très utile.

    Il semblerait aussi que $interface[’tables_jointures’] le permette aussi, à utiliser dans le pipeline declarer_tables_interfaces. Syntaxe supposée (à confirmer) :

    $interface['tables_jointures']['spip_bibliotheques'][] = 'livres'

    avec spip_livres possédant une clé étrangère (id_bibliotheque) vers spip_bibliotheques

    ++

    • Le 17 mai 2011 à 16:05, par severo En réponse à : Notes sur les jointures entre tables

      Oui, il y a pas mal de mécanismes pour les jointures, et j’ai pas tout détaillé dans l’article (ni tout compris d’ailleurs). Si tu veux, je te mets comme auteur de l’article et tu rajoutes un paragraphe...

    Répondre à ce message

  • Le 16 avril 2011 à 11:51, par Matthieu Marcillaud En réponse à : Notes sur les jointures entre tables

    Excellente synthèse effectivement.

    Merci .)

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d'abord sur gravatar.com (gratuit et indolore) et n'oubliez pas d'indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • ScolaSPIP pour SPIP3

    21 mai – commentaires

    Un plugin-squelette personnalisable pour sites Web d’établissements scolaires

  • Enluminures typographiques V3

    25 juillet 2009 – 115 commentaires

    Les Enluminures typographiques V3 permettent d’ajouter au Porte plume les raccourcis typographiques présents dans le Plugin Barre Typographique Enluminée. C’est une extension du PortePlume. Pour la documentation d’usage, se reporter à celle du (...)

  • Thélia

    26 juin 2007 – 855 commentaires

    Une approche basée sur l’utilisation conjointe des deux logiciels SPIP et Thélia pour la réalisation de sites de publication et de vente en ligne

  • Squirrels Love Chimps

    14 février – commentaires

    Squirrels Love Chimps met à disposition une série de 4 plugins pour connecter votre SPIP avec le service d’emailing MailChimp MailChimp, qu’est-ce que c’est ? Mailchimp est un outil d’emailing ou, dans dans la langue de Molière, « un service d’envoi (...)

  • Plugin « Langue préférée par l’internaute »

    25 août 2009 – 20 commentaires

    Cet article explique comment fonctionne le plugin « Langue préférée par l’internaute » (langue_preferee) et comment le mettre dans un site multilingue existant.