SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Descarregar

Les unions entre taules

Juliol de 2010 — mis à jour le : Agost de 2010

Totes les versions d’aquest article:

Exemples de bucles que produeixen una combinació múltiple entre 3 taules
[spip 2.0.9]


Volem, en un bucle, recuperar les informacions d’articles d’una (o diverses) secció a la que se li assigna una paraula clau (que nosaltres coneixem).

<BOUCLE_a(ARTICLES spip_mots_rubriques spip_mots) {titre_mot=truc}>

crearà la petició sql següent:

 SELECT articles.id_rubrique,
        articles.id_article,
        ...
        articles.lang
   FROM spip_articles AS `articles`
        INNER JOIN spip_mots_rubriques AS L1
                ON L1.id_rubrique = articles.id_rubrique
        INNER JOIN spip_mots AS L2
                ON L2.id_mot = L1.id_mot
  WHERE articles.statut = 'publie'
    AND L2.titre = 'truc'
GROUP BY articles.id_article

Volem en un bucle seleccionar aleatòriament un document a dins d’un sector. électionner aléatoirement un document dans un secteur. És a dir que aquest sector no conté articles, només seccions amb documents vinculats (fototeca).

<BOUCLE_d(spip_documents_liens rubriques)
         {objet = rubrique}
         {rubriques.id_secteur = 13}
         {par hasard}
         {0, 1}>
 #LOGO_DOCUMENT
</BOUCLE_d>

-  la taula spip_documents_liens és una taula que fa inventari els enllaços (unions) entre un document i un objet (article, secció, paraula, lloc...).

Entrades tipus d’aquesta taula podrien semblar-se a:

id_document id_objet objet vu
14 36 article non
363 66 rubrique non
... ... ... ...

Per tant, anirem a buscar a dins d’aquesta taula els documents relacionats a una secció {objet = rubrique}

Però volem, també, que aquesta secció sigui descendent de la secció sector d’id 13

Hem d’establir, per tant, a dins de la nostra petició una unió entre la taula spip_documents_liens i spip_rubriques

Aquesta unió es farà per una banda:
l’id_objet de spip_documents_liens, de l’altra
l’id_rubrique de spip_rubriques

Per això indicarem a SPIP que volem aquesta unió específica donant les 2 taules al bucle <BOUCLE_d(spip_documents_liens rubriques)...

Finalment, per especificar la nostra restricció respecte al sector 13, precisarem el criteri {rubriques.id_secteur = 13} especificant explícitament el nom complet del camp (nom de la taula inclòs) per tal que la petició no vagi a buscar un camp spip_documents_liens.id_secteur que no existeixi.

-  a partir d’aquest bucle, per tant, tindrem llavors accés a tots els camps de spip_documents_liens i a tots els de spip_rubriques :

#ID_DOCUMENT
#ID_OBJET
#OBJET
#VU

#ID_RUBRIQUE
#ID_PARENT
#TITRE
#DESCRIPTIF
#TEXTE
#ID_SECTEUR
...

-  la petició sql creada pel nostre bucle:

 SELECT rand() AS alea,
        spip_documents_liens.id_document
   FROM spip_documents_liens AS `spip_documents_liens`
        INNER JOIN spip_rubriques AS L1
                ON L1.id_rubrique = spip_documents_liens.id_objet
               AND spip_documents_liens.objet = 'rubrique'
  WHERE spip_documents_liens.objet = 'rubrique'
    AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
        spip_documents_liens.id_objet,
        spip_documents_liens.objet
ORDER BY alea
  LIMIT 0,1

-  finalment, l’etiqueta #LOGO_DOCUMENT ens retornarà el codi font html:

<img src='local/cache-vignettes/L135xH150/Image_10-d84e2.png'
width='135' height='150' style='height:150px;width:135px;' alt=''
class='spip_logos' />

I si volem el nom del fitxer document, que no podem tenir directament amb aquesta petició ja que el camp spip_documents.fichier no es recollit (no hi ha unió amb la taula spip_documents), llavors haurem de declarar una unió suplementària a la taula spip_documents:

<BOUCLE_d(spip_documents_liens documents rubriques)
         {objet = rubrique}
         {rubriques.id_secteur = 13}
         {par hasard}
         {0, 1}>
#LOGO_DOCUMENT / #FICHIER
</BOUCLE_d>

Petició creada:

 SELECT rand() AS alea,
        spip_documents_liens.id_document,
        L2.fichier
   FROM spip_documents_liens AS `spip_documents_liens`
        INNER JOIN spip_documents AS L2
                ON L2.id_document = spip_documents_liens.id_document
        INNER JOIN spip_rubriques AS L1
                ON L1.id_rubrique = spip_documents_liens.id_objet
               AND spip_documents_liens.objet='rubrique'
  WHERE spip_documents_liens.objet = 'rubrique'
    AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
        spip_documents_liens.id_objet,
        spip_documents_liens.objet
ORDER BY alea
  LIMIT 0,1

Alerta núm. 1:
-  aquí, tenim gairebé accés a tots els camps de les 3 taules
«gairebé» però alerta als camps homònims:
els #TITRE, #DESCRIPTIF, #MAJ, #STATUT i #DATE mostrats, que són camps homònims a spip_documents i spip_rubriques, seran els de spip_documents (taula primera de la petició)!

Alerta núm. 2:
-  les escriptures de nom de taula

si :

 <BOUCLE_d(DOCUMENTS_LIENS
 <BOUCLE_d(documents_liens
  <BOUCLE_d(SPIP_DOCUMENTS_LIENS
  <BOUCLE_d(spip_documents_liens

són équivalentes ;

com:

 <BOUCLE_d(documents_liens documents rubriques
 <BOUCLE_d(documents_liens documents spip_rubriques
 <BOUCLE_d(documents_liens documents RUBRIQUES

són equivalent;

i fins i tot:

 <BOUCLE_d(documents_liens documents
 <BOUCLE_d(documents_liens spip_documents
 <BOUCLE_d(spip_documents_liens spip_documents
 <BOUCLE_d(spip_documents_liens documents

també són equivalent;

no és el mateix amb:

 <BOUCLE_d(DOCUMENTS_LIENS DOCUMENTS
 <BOUCLE_d(documents_liens DOCUMENTS
 <BOUCLE_d(SPIP_DOCUMENTS_LIENS DOCUMENTS
 <BOUCLE_d(spip_documents_liens DOCUMENTS

on la manera com s’esciu documents ocasiona una pèrdua d’unió entre spip_documents_liens i spip_documents.


Descarregar l’esquelet d’aquesta pàgina Lloc Web fet amb l’SPIP | Espace de traduction | Espai privat