jointures.php
SPIP, Système de publication pour l'internet
Copyright © avec tendresse depuis 2001 Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
Ce programme est un logiciel libre distribué sous licence GNU/GPL.
Table of Contents
Functions
- decompose_champ_id_objet() : array<string|int, mixed>|string
- Décomposer un champ id_truc en (id_objet,objet,truc)
- trouver_champs_decomposes() : array<string|int, mixed>
- Mapping d'un champ d'une jointure en deux champs id_objet,objet si nécessaire
- calculer_jointure() : string
- Calculer et construite une jointure entre $depart et $arrivee
- fabrique_jointures() : string
- Fabriquer une jointure à l'aide d'une liste descriptive d'étapes
- nogroupby_if() : bool
- Condition suffisante pour qu'un Group-By ne soit pas nécéssaire
- liste_champs_jointures() : array<string|int, mixed>
- Lister les champs candidats a une jointure, sur une table si un join est fourni dans la description, c'est lui qui l'emporte sauf si cle primaire explicitement demandee par $primary
- split_key() : array<string|int, mixed>
- Eclater une cle composee en plusieurs champs
- calculer_chaine_jointures() : array<string|int, mixed>
- Constuire la chaine de jointures, de proche en proche
- trouver_cles_table() : array<string|int, mixed>
- applatit les cles multiples redondance avec split_key() ? a mutualiser
- chercher_champ_dans_tables() : array<string|int, mixed>|false
- Indique si une colonne (ou plusieurs colonnes) est présente dans l'une des tables indiquée.
- trouver_champ_exterieur() : array<string|int, mixed>|string
- Cherche une colonne (ou plusieurs colonnes) dans les tables de jointures possibles indiquées.
- trouver_jointure_champ() : string
- Cherche a ajouter la possibilite d'interroger un champ sql dans une boucle.
Functions
decompose_champ_id_objet()
Décomposer un champ id_truc en (id_objet,objet,truc)
decompose_champ_id_objet(string $champ) : array<string|int, mixed>|string
Exemple : décompose id_article en (id_objet,objet,article)
Parameters
- $champ : string
-
Nom du champ à décomposer
Return values
array<string|int, mixed>|string —Tableau si décomposable : 'id_objet', 'objet', Type de l'objet Chaine sinon : le nom du champ (non décomposable donc)
trouver_champs_decomposes()
Mapping d'un champ d'une jointure en deux champs id_objet,objet si nécessaire
trouver_champs_decomposes(string $champ, array<string|int, mixed> $desc) : array<string|int, mixed>
Si le champ demandé existe dans la table, on l'utilise, sinon on regarde si le champ se décompose en objet/id_objet et si la table possède ces champs, et dans ce cas, on les retourne.
Parameters
- $champ : string
-
Nom du champ à tester (ex. id_article)
- $desc : array<string|int, mixed>
-
Description de la table
Tags
Return values
array<string|int, mixed> —Liste du/des champs. Soit
- array($champ), si le champ existe dans la table ou si on ne peut décomposer.
- array(id_objet, objet), si le champ n'existe pas mais qu'on peut décomposer
calculer_jointure()
Calculer et construite une jointure entre $depart et $arrivee
calculer_jointure(Boucle &$boucle, array<string|int, mixed> $depart, array<string|int, mixed> $arrivee[, string $col = '' ][, bool $cond = false ][, int $max_liens = 5 ]) : string
L'objet boucle est modifié pour compléter la requête. La fonction retourne l'alias d'arrivée une fois la jointure construire, en general un "Lx"
Parameters
- $boucle : Boucle
-
Description de la boucle
- $depart : array<string|int, mixed>
-
Table de départ, sous la forme (nom de la table, description de la table)
- $arrivee : array<string|int, mixed>
-
Table d'arrivée, sous la forme (nom de la table, description de la table)
- $col : string = ''
-
Colonne cible de la jointure
- $cond : bool = false
-
Flag pour savoir si le critère est conditionnel ou non
- $max_liens : int = 5
-
Nombre maximal de liaisons possibles pour trouver la jointure.
Tags
Return values
string —Alias de la table de jointure (Lx)
fabrique_jointures()
Fabriquer une jointure à l'aide d'une liste descriptive d'étapes
fabrique_jointures(Boucle &$boucle, array<string|int, mixed> $res[, bool $cond = false ][, array<string|int, mixed> $desc = [] ][, string $nom = '' ][, string $col = '' ][, bool $echap = true ]) : string
Ajoute
- la jointure dans le tableau $boucle->join,
- la table de jointure dans le from
- un modificateur 'lien'
Parameters
- $boucle : Boucle
-
Description de la boucle
- $res : array<string|int, mixed>
-
Chaîne des jointures $res = array( array(table_depart,array(table_arrivee,desc),jointure), ... ) Jointure peut être un tableau pour les jointures sur champ decomposé array('id_article','id_objet','objet','article') array('id_objet','id_article','objet','article')
- $cond : bool = false
-
Flag pour savoir si le critère est conditionnel ou non
- $desc : array<string|int, mixed> = []
-
Description de la table de départ
- $nom : string = ''
-
Nom de la table de départ
- $col : string = ''
-
Colonne cible de la jointure
- $echap : bool = true
-
Écrire les valeurs dans boucle->join en les échappant ou non ?
Tags
Return values
string —Alias de la table de jointure (Lx)
nogroupby_if()
Condition suffisante pour qu'un Group-By ne soit pas nécéssaire
nogroupby_if(array<string|int, mixed> $depart, array<string|int, mixed> $arrivee, string|array<string|int, mixed> $col) : bool
À améliorer, notamment voir si calculer_select ne pourrait pas la réutiliser lorsqu'on sait si le critere conditionnel est finalement present
Parameters
- $depart : array<string|int, mixed>
- $arrivee : array<string|int, mixed>
- $col : string|array<string|int, mixed>
Tags
Return values
boolliste_champs_jointures()
Lister les champs candidats a une jointure, sur une table si un join est fourni dans la description, c'est lui qui l'emporte sauf si cle primaire explicitement demandee par $primary
liste_champs_jointures(string $nom, array<string|int, mixed> $desc[, bool $primary = false ]) : array<string|int, mixed>
sinon on construit une liste des champs a partir de la liste des cles de la table
Parameters
- $nom : string
- $desc : array<string|int, mixed>
- $primary : bool = false
Tags
Return values
array<string|int, mixed>split_key()
Eclater une cle composee en plusieurs champs
split_key(string $v[, array<string|int, mixed> $join = [] ]) : array<string|int, mixed>
Parameters
- $v : string
- $join : array<string|int, mixed> = []
Tags
Return values
array<string|int, mixed>calculer_chaine_jointures()
Constuire la chaine de jointures, de proche en proche
calculer_chaine_jointures(objetc &$boucle, array<string|int, mixed> $depart, array<string|int, mixed> $arrivee[, array<string|int, mixed> $vu = [] ][, array<string|int, mixed> $milieu_exclus = [] ][, int $max_liens = 5 ]) : array<string|int, mixed>
Parameters
- $boucle : objetc
- $depart : array<string|int, mixed>
-
sous la forme array(nom de la table, description)
- $arrivee : array<string|int, mixed>
-
sous la forme array(nom de la table, description)
- $vu : array<string|int, mixed> = []
-
tables deja vues dans la jointure, pour ne pas y repasser
- $milieu_exclus : array<string|int, mixed> = []
-
cles deja utilisees, pour ne pas les reutiliser
- $max_liens : int = 5
-
nombre maxi d'etapes
Tags
Return values
array<string|int, mixed>trouver_cles_table()
applatit les cles multiples redondance avec split_key() ? a mutualiser
trouver_cles_table(array<string|int, mixed> $keys) : array<string|int, mixed>
Parameters
- $keys : array<string|int, mixed>
Return values
array<string|int, mixed>chercher_champ_dans_tables()
Indique si une colonne (ou plusieurs colonnes) est présente dans l'une des tables indiquée.
chercher_champ_dans_tables(string|array<string|int, mixed> $cle, array<string|int, mixed> $tables, string $connect[, bool|string $checkarrivee = false ]) : array<string|int, mixed>|false
Parameters
- $cle : string|array<string|int, mixed>
-
Nom de la ou des colonnes à trouver dans les tables indiquées
- $tables : array<string|int, mixed>
-
Liste de noms de tables ou des couples (alias => nom de table).
$boucle->from
(alias => nom de table) : les tables déjà utilisées dans une boucle$boucle->jointures
: les tables utilisables en tant que jointure$boucle->jointures_explicites
les jointures explicitement indiquées à l'écriture de la boucle
- $connect : string
-
Nom du connecteur SQL
- $checkarrivee : bool|string = false
-
false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table où on veut trouver le champ.
Return values
array<string|int, mixed>|false —false : on n'a pas trouvé array : infos sur la table trouvée. Les clés suivantes sont retournés :
- 'desc' : tableau de description de la table,
- 'table' : nom de la table
- 'alias' : alias utilisé pour la table (si pertinent. ie: avec
$boucle->from
transmis par exemple)
trouver_champ_exterieur()
Cherche une colonne (ou plusieurs colonnes) dans les tables de jointures possibles indiquées.
trouver_champ_exterieur(string|array<string|int, mixed> $cle, array<string|int, mixed> $joints, Boucle &$boucle[, bool|string $checkarrivee = false ]) : array<string|int, mixed>|string
Parameters
- $cle : string|array<string|int, mixed>
-
Nom de la ou des colonnes à trouver dans les tables de jointures
- $joints : array<string|int, mixed>
-
Liste des jointures possibles (ex: $boucle->jointures ou $boucle->jointures_explicites)
- $boucle : Boucle
-
Description de la boucle
- $checkarrivee : bool|string = false
-
false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table jointe où on veut trouver le champ.
Tags
Return values
array<string|int, mixed>|string —chaîne vide : on n'a pas trouvé liste si trouvé : nom de la table, description de la table, clé(s) de la table
trouver_jointure_champ()
Cherche a ajouter la possibilite d'interroger un champ sql dans une boucle.
trouver_jointure_champ(string $champ, object &$boucle[, array<string|int, mixed> $jointures = false ][, bool $cond = false ][, bool|string $checkarrivee = false ]) : string
Cela construira les jointures necessaires si une possibilite est trouve et retournera le nom de l'alias de la table contenant ce champ (L2 par exemple pour 'spip_mots AS L2' dans le FROM),
Parameters
- $champ : string
-
Nom du champ cherche (exemple id_article)
- $boucle : object
-
Informations connues de la boucle
- $jointures : array<string|int, mixed> = false
-
Liste des tables parcourues (articles, mots) pour retrouver le champ sql et calculer la jointure correspondante. En son absence et par defaut, on utilise la liste des jointures connues par SPIP pour la table en question ($boucle->jointures)
- $cond : bool = false
-
flag pour savoir si le critere est conditionnel ou non
- $checkarrivee : bool|string = false
-
false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table jointe où on veut trouver le champ.