Créer un critère pour une jointure

Il est également possible de définir un critère pour forcer une jointure.

Exemple

On veut enrichir une boucle sur la table spip_entreprises en y joignant une table spip_entreprises_details qui partage la même clef primaire id_entreprise.

On définit pour cela le critère {avec_details}, ici pour un LEFT JOIN :

function critere_avec_details_dist($idb, &$boucles, $crit) {
  $boucle = &$boucles[$idb];
  $boucle->from['entreprises_details'] = 'spip_entreprises_details';
  $boucle->from_type['entreprises_details'] = 'LEFT';
  $boucle->join['entreprises_details']= array(
    "'entreprises'",
    "'id_entreprise'",  // champ de spip_entreprises_details
    "'id_entreprise'"   // champ de spip_entreprises
  );		
}

Il sera ainsi possible d’accéder aux champs de spip_entreprises_details dans une boucle (ENTREPRISES){avec_details}.

Pour utiliser aussi un critère sur un champ de spip_entreprises_details, il faut en plus insérer la ligne suivante dans le code du critère :

$boucle->jointures[] = 'entreprises_details';

Créer un critère pour ajouter un FROM et un WHERE

On peut également créer un critère {where_details} qui ajoute une table dans le FROM et un WHERE dans la query SQL.

function critere_where_details_dist($idb, &$boucles, $crit) {
  $boucle = &$boucles[$idb];
  $boucle->from['entreprises_details'] = 'spip_entreprises_details';
  $where = array("'='", "'entreprises.id_entreprise'", "'entreprises_details.id_entreprise'");
  $boucle->where[] = $where;	
}

Liens complémentaires
 Sur spip.net : Les jointures entre tables
 Sur le carnet wiki : Le Carnet Jointure présente des notes et explorations sur les jointures SPIP
 Sur le blog de b_b : Divagations sur les jointures avec SPIP

Auteur JLuc Publié le : Mis à jour : 10/09/23