SPIP-Contrib

SPIP-Contrib

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

286 Plugins, 197 contribs sur SPIP-Zone, 284 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]

16 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>

Télécharger

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>

Télécharger

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>

Télécharger

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>

Télécharger

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>

Télécharger

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>

Télécharger

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>

Télécharger

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");

Télécharger

Quelques liens

Dernière modification de cette page le 24 mai 2011

Retour en haut de la page

Vos commentaires

  • Le 29 octobre à 23:17, par koan En réponse à : Notes sur les jointures entre tables

    Bonjour,

    J’ai « créé » pour mais besoin un plugin avec « la fabrique », ce dernier ajoute 3 objets d’éditions :

    • Profils, avec une table « profils »
    • Expériences, avec une table « experiences » et « experiences_liens »
    • Compétences, avec une table « competences » et « competences_liens »

    Mon soucis n’est pas dans l’utilisation de « La Fabrique » mais dans les jointures et la récupération des informations des différentes expériences et compétences en fonction d’un profil.
    J’ai fait pour l’occasion un squelette simple avec ce code pour test :

    1. <BOUCLE_table(profils spip_experiences spip_competences){id_profil=1}>
    2. <h1>#PRENOM #NOM</h1>
    3. <p>#PROFIL</p>
    4. <p>#PERIODE : <strong>#POSTE_OCCUPE</strong></p>
    5. <p>#TEXTE</p>
    6. <p>#COMPETENCE - #NIVEAU - #POURCENTAGE</p>
    7. </BOUCLE_table>

    Télécharger

    Comment récupérer l’intégralité des expériences et des compétences lié au profil 1 ?
    Parce que pour l’heure, je n’affiche qu’un seul enregistrement sur les 2 expériences et les 2 compétences liés au profil en question.

    Merci de votre aide.

    • Le 30 octobre à 11:18, par koan En réponse à : Notes sur les jointures entre tables

      Réponse à moi-même, après une nuit de sommeil et un regard différent sur le problème je l’ai résolu moi même.

      Merci à ceux qui ont cherché ou ce sont posé la question.

    • Le 30 octobre à 11:50, par pierre.laszczak@gmail.com En réponse à : Notes sur les jointures entre tables

      Bonjour !

      c’est normal comme comportement.
      Pourquoi ne pas faire plusieurs boucles ?
      Pourquoi utiliser une table pivot de liens ?? :
      id_profil sur experiences et competences ne suffirait-il pas ?

      Mais dans votre cas précis je vois pas pourquoi il faut utiliser une jointure^

    • Le 6 novembre à 10:17, par koan En réponse à : Notes sur les jointures entre tables

      Bonjour,
      c’est effectivement la solution simple et efficace que Morphée (id_profil sur experiences et competences) m’a suggéré...

      Merci encore.

    Répondre à ce message

  • 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

  • Adaptive Images

    15 novembre 2013 – 66 commentaires

    Un plugin pour permettre aux sites responsive d’adapter automatiquement les images de la page à l’écran de consultation. Adaptive Images, que l’on pourrait traduire par Images adaptatives, désigne la pratique qui vise à adapter les taille, (...)

  • Métas

    8 août 2009 – 50 commentaires

    Ce petit plugin permet l’ajout, depuis l’espace privé, de metatags aux articles et rubriques de SPIP, ainsi que la mise en exergue de mots importants.

  • Brownie

    6 juillet 2012 – 43 commentaires

    Brownie est une adaptation pour Zpip du thème du même nom initialement développé par Egrappler.com. Présentation Brownie est un thème Responsive à deux colonnes. La démonstration ci-dessous utilise la version 2.0.0 de Brownie, la dist de SPIP3 (...)

  • Métas +

    3 décembre – 13 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

  • Acces Restreint 3.0

    11 décembre 2008 – 785 commentaires

    Le plugin accès restreint permet de définir et de gérer des zones de l’espace public en accès restreint. Cette version du plugin a été redévelopée et optimisée tout spécialement pour SPIP 2.0. Il en découle une amélioration des performances sur les gros (...)

Ça spipe par là