[spip-dev] Jointure Document et Rubrique ,

S'lt

Depuis un id_document je souhaite obtenir l'id_rubrique

La syntaxe qui semble le plus proche de ce que je souhaite :

<BOUCLE_rub(DOCUMENTS_LIENS RUBRIQUES) {id_document}
{rubriques.id_rubrique = documents_liens.id_objet} >
</BOUCLE_rub>

me donne ceci

SELECT documents_liens.id_objet
FROM spip_documents_liens AS `documents_liens`
INNER JOIN spip_rubriques AS L1 ON ( L1.id_rubrique = documents_liens.id_objet )
WHERE (documents_liens.id_document = 445)
    AND (documents_liens.objet = 'rubrique')
    AND (L1.id_rubrique = 'documents_liens.id_objet')
GROUP BY documents_liens.id_document,documents_liens.id_objet,documents_liens.objet

La clause AND (L1.id_rubrique = 'documents_liens.id_objet') me semble
problématique alors que le INNER JOIN semble correct

Une idée ?

km

S'lt

Cedric m'a donné cette réponse :

<BOUCLE_doc(DOCUMENTS){id_document=xx}{id_rubrique>0}>

Or la requete genérée est

SELECT 1
FROM spip_documents AS `documents`
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document =
documents.id_document )
WHERE (documents.mode != 'vignette')
    AND (documents.taille > 0 OR documents.distant='oui')
    AND (documents.id_document = 442)
    AND (L1.id_objet > 0)
    AND (L1.objet = 'rubrique')
GROUP BY documents.id_document

Or il y a un petit pb ça fait un SELECT 1 FROM ... ça ne prend pas en
compte les balises déclarées dans la boucle

Si j'execute la requete à la main avec SELECT id_objet FROM ... je
retrouve bien mes petits

Pas besoin de jointure:

<BOUCLE0(DOCUMENTS_LIENS){objet="rubrique"}{id_document}>#ID_OBJET</BOUCLE0>

Et si on veut le titre de la rubrique:

<BOUCLE0(DOCUMENTS_LIENS){objet="rubrique"}{id_document}>
       <br />#ID_DOCUMENT #ID_OBJET
       <BOUCLE1(RUBRIQUES){id_rubrique=#ID_OBJET}>#TITRE</BOUCLE1>
</BOUCLE0>

Committo,Ergo:Sum

Si tu as juste ecrie
<BOUCLE_doc(DOCUMENTS){id_document=xx}{id_rubrique>0}>
</BOUCLE_doc>

la requete generee est tout a fait normale : ta boucle ne fait rien, elle n'a aucune raison de Select quoi que ce soit....

Essaie donc
<BOUCLE_doc(DOCUMENTS){id_document=xx}{id_rubrique>0}>
#ID_DOCUMENT<br />
</BOUCLE_doc>

Cédric

S'lt

Essaie donc
<BOUCLE_doc(DOCUMENTS){id_document=xx}{id_rubrique>0}>
#ID_DOCUMENT<br />
</BOUCLE_doc>

Ok lors de mest test j'avais mis #ID_OBJET et #ID_RUBRIQUE, cela ne marche pas.
#ID_DOCUMENT me retroune bien un resultat mais dans ce cadre ce n'est
pas tres pertinent :slight_smile:

<BOUCLE0(DOCUMENTS_LIENS){objet="rubrique"}{id_document}>
     <br />#ID_DOCUMENT #ID_OBJET
     <BOUCLE1(RUBRIQUES){id_rubrique=#ID_OBJET}>#TITRE</BOUCLE1>
</BOUCLE0>

Cette solution marche

Remarque ils pourraient être bon de faire (re)venir les balises
#ID_RUBRIQUE, #ID_ARTICLE, ...
#ID_OBJET c'est vraimernt génial mais pour le webmestre j'ai un doute
sur la pertinence de ce nouveau concept.

S'lt

Essaie donc
<BOUCLE_doc(DOCUMENTS){id_document=xx}{id_rubrique>0}>
#ID_DOCUMENT<br />
</BOUCLE_doc>

Ok lors de mest test j'avais mis #ID_OBJET et #ID_RUBRIQUE, cela ne marche pas.

il me semble pourtant que la requete devrait produire un 'id_objet as id_rubrique' dans ce cas ...
c'est donc la le bug !

#ID_DOCUMENT me retroune bien un resultat mais dans ce cadre ce n'est
pas tres pertinent :slight_smile:

<BOUCLE0(DOCUMENTS_LIENS){objet="rubrique"}{id_document}>
     <br />#ID_DOCUMENT #ID_OBJET
     <BOUCLE1(RUBRIQUES){id_rubrique=#ID_OBJET}>#TITRE</BOUCLE1>
</BOUCLE0>

Cette solution marche

non, documents_liens est une structure d'implementation sous jacente qui ne devrait jamais avoir à apparaitre dans les skels

Cédric

Quand a-t-il été question de faire ça ?
C'est une limitation des squelettes de SPIP de ne pouvoir faire une jointure sur des clés de nom différent,
ça ne me parait pas envisageable de résoudre ça dans l'immédiat.

Committo,Ergo:Sum

S'lt

il me semble pourtant que la requete devrait produire un 'id_objet as
id_rubrique' dans ce cas ...
c'est donc la le bug !

Ok rassuré je craignais qu'il soit situé entre la chaise et le clavier.

non, documents_liens est une structure d'implementation sous jacente qui ne
devrait jamais avoir à apparaitre dans les skels

Dans ce cas il faut proposer une alternative je ne pense pas que ce
soit rare de se demander "Mais où se trouve ce document ?" .

Sauf le cas particulier de jointure traité automatiquement par le compilateur :
de id_xx vers (id_objet ET objet=xx)
qui se traduit par un
ON (a.id_article=L.id_objet )
WHERE L.objet=article

et de mémoire j'y avais ajouté un select id_objet AS id_xx
(à moins que je n'ai rêvé l'avoir fait)
Cédric