Carnet Wiki

Jonctions Entre Tables

Version 6 — Octobre 2007 NicolasR

Voir aussi : (Archive) MultiBase sur SPIP 1.9.3 - Accés SPIP aux tables non-SPIP et jointures - Autre Table SPIP


Faire des jonctions entre les tables

Certaines tables, comme pour les mots où les documents peuvent être accédés directement depuis une autre boucle.

Par exemple, on peut utiliser directement le critère id_mot sur une boucle ARTICLES alors qu’il n’y a pas de telle colonne dans la table spip_articles.
SPIP gère automatiquement la jonction entre la table spip_articles et la table spip_mots_articles pour mettre en relation un article et les mots qui lui sont liés.

On peut facilement faire ce genre de chose pour ses tables ajoutées. Imaginons qu’on ajoute une table pour mettre des mots clef sur des auteurs. Il y faut donc faire un lien entre la table spip_mots et la table spip_auteurs.

On crée donc une table qui met un id_auteur en relation avec un id_mot :

CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9tb3RzX2F1dGV1cnMnICg8L2NvZGU+"></span>id_auteur<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+QklHSU5UKCAyMSApIE5PVCBOVUxMICw8L2NvZGU+"></span>id_mot` BIGINT( 21 ) NOT NULL
);

On peut donc déclarer cette nouvelle table dans le fichier mes_fonctions :

$tables_principales['mots_auteurs']['field'] = array(
        "id_mot"    => "BIGINT (21) DEFAULT '' NOT NULL",
        "id_auteur"    => "BIGINT (21) DEFAULT '' NOT NULL");


$tables_principales['mots_auteurs']['key'] = array(
        "KEY id_mot"    => "id_mot",
        "KEY id_auteur"    => "id_auteur");

Il y a donc moyen d’accéder aux auteurs d’un mot en bouclant sur cette table :

<BOUCLE_mots(MOTS)>
<BOUCLE_jonction(MOTS_AUTEURS) {id_mot}>
<BOUCLE_auteur(AUTEURS) {id_auteur}>

Ce qu’on aimerait encore plus c’est de pouvoir directement trouver les mots associés à un auteur ou les auteurs associés à un mot sans passer par une boucle MOTS_AUTEURS.
Pour cela, il suffit d’ajouter des lignes dans la table $tables_relations :

$tables_relations['mots']['id_auteur'] = 'mots_auteurs';
$tables_relations['auteurs']['id_mot'] = 'mots_auteurs';

On dit ainsi que si on utilise la boucle mots avec un critère id_auteur, alors il faut faire la jonction sur la table spip_mots_auteurs.

Rem : pour une première implémentation, ne pas oublier les déclarations en global des tables tables_principales et tables_relations en tout début :

global $tables_principales;
global $tables_relations;

voir une application http://www.spip-contrib.net/Des-mot...

Attention, le tableau $tables_relations a été introduit avec la version 1.8.2, inutile de chercher à faire fonctionner la jonction entre tables sur les versions antérieures.

Remarques sur 1.9

Attention, il y a un pb dans la gestion du préfixe des tables.
Ce n’est pas facile car on veut assurer la compatibilité avec les
versions précédentes (qui ont nécessairement le préfixe « spip_ »
implicite ou son substitué) ET permettre de référencer des tables
quelconques.
La globale $table_des_tables, que tu n’utilises pas, contient la
liste des tables pour lequelles il faut rajouter le préfixe « spip_ ».
Donc, soit tu veux la gestion implicite de ce préfixe, et tu rajoutes
tes tables dans cette globale, soit tu geres explicitement ce
préfixe, et donc tu dois ecrire « tables_principales[’spip_lettres’]=
array(... » etc. Je conseille plutot la 2e methode, $table_des_tables
étant censée désigner les tables standards.

C’est un peu tordu, mais c’est le prix à payer de la compatibilité.

Déesse A. origine du message

Mise à jour 7 juin 2006

$tables_relations definitivement remplacée par $tables_jointures
voir http://zone.spip.org/trac/spip/chan...