Problème de jointure automatique

Bonjour !

J'ai une table 'spip_vu_publications' ainsi qu'une table auxiliaire 'spip_mots_vu_publications". Elles ont toutes les deux le champ 'id_publication' en commun... mais la jointure ne se fait automatiquement.

Notamment, la boucle <BOUCLE_p(VU_PUBLICATIONS){id_mot}> me retourne une belle erreur : « Erreur SQL : Unknown column 'id_mot' in 'where clause' ».

Alors que si je force, la boucle <BOUCLE_p(VU_PUBLICATIONS mots_vu_publications){mots_vu_publications.id_mot}> fonctionne bien.

Ça devrait pourtant fonctionner automatiquement... je me trompe ? Ou est mon erreur ?
Ci joint, une copie des déclarations de tables.

Merci d'avance pour les quelques pistes que vous m'indiquerez !

Jonathan.

----
TABLE PRINCIPALE

function vu_declarer_tables_principales($tables_principales){
  // Table 'spip_vu_publications'
  $publications = array(
           "id_publication" => "bigint(21) NOT NULL auto_increment",
           "titre" => "text NOT NULL",
           "lien" => "text NOT NULL",
    "auteur" => "text NOT NULL",
           "date" => "datetime NOT NULL",
           "statut" => "varchar(10) NOT NULL",
  );

  $publications_key = array(
           "PRIMARY KEY" => "id_publication"
  );

  $publications_join = array(
          "id_publication" => "id_publication"
  );

  $tables_principales['spip_vu_publications'] = array(
    'field' => &$publications,
    'key' => &$publications_key,
    'join' => &$publications_join
  );

  return $tables_principales;
}

TABLE AUXILIAIRE

function vu_declarer_tables_auxiliaires($tables_auxiliaires){
  
         $publications_mots = array(
                 "id_mot" => "BIGINT(21) NOT NULL",
                 "id_publication" => "BIGINT(21) NOT NULL"
         );
         $publications_mots_key = array(
                 "PRIMARY KEY" => "id_mot, id_publication",
         );

         $tables_auxiliaires['spip_mots_vu_publications'] = array(
                 'field' => &$publications_mots,
                 'key' => &$publications_mots_key
         );

         return $tables_auxiliaires;
}

Ah, j'oubliais, voici la façon dont je déclare les jointures...

----

JOINTURES

function vu_declarer_tables_interfaces($interface){
  
$interface['table_des_tables']['vu_publications'] = 'vu_publications';
            $interface['tables_jointures']['spip_vu_publications']['id_publication'] = 'mots_vu_publications';
$interface['tables_jointures']['spip_mots_vu_publications']['id_publication'] = 'vu_publications';

$interface['tables_jointures']['spip_mots']['id_mot'] = 'spip_mots_vu_publications'; $interface['tables_jointures']['spip_mots_vu_publications']['id_mot'] = 'spip_mots';

        return $interface;
}

Jonathan a écrit :

Ah, j'oubliais, voici la façon dont je déclare les jointures...

J'ai récemment fait une jointure équivalente à la tienne,
véritablement automatiquement puisque sans rien déclarer
au préallable à SPIP... c'est plus simple !

<BOUCLE_envois(t_envois t_revues){id_revue}{date=0000-00-00 00:00:00}{adresse !== '^NPAI'}>

Remarques :
1) les tables n'ont pas leur nom préfixé par spip_
2) les noms de tables sont en minuscule dans la boucle
3) c'est expliqué là :
Accés SPIP aux tables non-SPIP et jointures - SPIP-Contrib jointures

Sinon, à mon avis, le seul intérêt de déclarer une jointure dans table_jointure
serait de n'avoir plus besoin de convoquer qu'une seule table dans la boucle,
l'autre étant convoquée automatiquement,
sinon je vois pas l'utilité de cette complication ....

Bonne chance,
JLuc

JOINTURES

function vu_declarer_tables_interfaces($interface){
    $interface['table_des_tables']['vu_publications'] = 'vu_publications';
             $interface['tables_jointures']['spip_vu_publications']['id_publication'] = 'mots_vu_publications';
$interface['tables_jointures']['spip_mots_vu_publications']['id_publication'] = 'vu_publications';

$interface['tables_jointures']['spip_mots']['id_mot'] = 'spip_mots_vu_publications'; $interface['tables_jointures']['spip_mots_vu_publications']['id_mot'] = 'spip_mots';

       return $interface;
}

Sinon, à mon avis, le seul intérêt de déclarer une jointure dans table_jointure
serait de n'avoir plus besoin de convoquer qu'une seule table dans la boucle,
l'autre étant convoquée automatiquement,
sinon je vois pas l'utilité de cette complication ....

Tout à fait. Et ça fonctionne aussi ici quand on convoque les deux tables dans la boucle, mais c'est exactement ce que je voulais éviter.

Pourquoi je souhaite absolument cette complication ? Parce qu'en fait c'est un plugin que je développe, et je voudrais que ces nouvelles tables soient pour les utilisateurs d'une utilisation tout à fait transparente.

Oui, c'est uniquement pour le confort... :wink:

Jonathan a écrit :

Pourquoi je souhaite absolument cette complication ? Parce qu'en fait c'est un plugin que je développe, et je voudrais que ces nouvelles tables soient pour les utilisateurs d'une utilisation tout à fait transparente.

C'est sympa pour eux ...

as tu étudié programmer.spip.org et le dernier article de marcimat
sur magraine ?