Je n'arrive pas à faire de déclaration de jointure correcte dans les interfaces pour permetttre de lier 2 tables qui n'ont pas les mêmes noms de clés primaire. Est-ce possible ?
En gros, j'ai ces 2 tables :
spip_contacts (id_auteur)
spip_organisations_contacts(id_contact, id_organisation)
Je veux lier contacts.id_auteur à organisations_contacts.id_contact, si possible avec la magie de SPIP mais n'y arrive pas. Y a-t-il une solution (sachant que chaque table est déclarée et possède des noms raccourcis pour faire des boucles).
Réussir à faire l'une OU l'autre des boucles suivantes me conviendrait :
<BOUCLE_c(CONTACTS){id_organisation?}>
<BOUCLE_c(ORGANISATIONS_CONTACTS contacts){id_organisation?}>
Y a moyen ? sinon... bah, je duplique id_auteur sur ma table en 'id_contact' et je gère cette redondance...
Non. Les jointures automatiques reposent sur l'identité des noms de clés. SPIP fait un effort en cherchant automatique une 3e table (voire plus) permettant de passer de celle d'arrivée à celle de départ, et gère aussi les clés primaires multiples (objet + id_objet) mais c'est tout. C'est un autre point de sémantique qu'il serait bon de clarifier: en gros SPIP fait des jointures de type "USING", pas beaucoup plus.
Je n'arrive pas à faire de déclaration de jointure correcte dans les interfaces pour permetttre de lier 2 tables qui n'ont pas les mêmes noms de clés primaire. Est-ce possible ?
En gros, j'ai ces 2 tables :
spip_contacts (id_auteur)
spip_organisations_contacts(id_contact, id_organisation)
Je veux lier contacts.id_auteur à organisations_contacts.id_contact, si possible avec la magie de SPIP mais n'y arrive pas. Y a-t-il une solution (sachant que chaque table est déclarée et possède des noms raccourcis pour faire des boucles).
Réussir à faire l'une OU l'autre des boucles suivantes me conviendrait :
<BOUCLE_c(CONTACTS){id_organisation?}>
<BOUCLE_c(ORGANISATIONS_CONTACTS contacts){id_organisation?}>
Y a moyen ? sinon... bah, je duplique id_auteur sur ma table en 'id_contact' et je gère cette redondance...
Le moyen le plus élégant que j'ai trouvé pour faire ce genre de chose est de rajouter une vue dans la base SQL:
create view auteur_organisation as (select spip_auteurs.id_auteur, spip_contacts.id_organisation, ...,
from spip_auteurs left outer join spip_contacts on spip_auteurs.id_auteur= spip_contact.id_auteur
left outer join spip_organisations_contacts on spip_contact.id_auteur = spip_organisations_contacts.id_contact)
et tu n'as plus qu'à faire une boucle sur ta vue comme si c'était une table normale.
Le moyen le plus élégant que j'ai trouvé pour faire ce genre de chose est de
rajouter une vue dans la base SQL:
create view auteur_organisation as (select spip_auteurs.id_auteur,
spip_contacts.id_organisation, ...,
from spip_auteurs left outer join spip_contacts on spip_auteurs.id_auteur=
spip_contact.id_auteur
left outer join spip_organisations_contacts on spip_contact.id_auteur =
spip_organisations_contacts.id_contact)
et tu n'as plus qu'à faire une boucle sur ta vue comme si c'était une table
normale.