Comment effectuer la jointure avec plusieurs colonnes en utilisant db_select?


8

Comment effectuer la jointure avec plusieurs colonnes en utilisant db_select? De l'aide?

Voici ci-dessous l'exemple que je recherche.

SELECT * FROM digitaliq_flds_by_node a
JOIN digitaliq_fld_category b ON
  a.fld_id = b.fld_id AND
  a.fld_collection_id = b.fld_collection_id AND
  a.fld_group_name = b.fld_group_name

Réponses:


10

Vous pouvez utiliser le code suivant.

$query = db_select('digitaliq_flds_by_node', 'a')->fields('a');

$alias = $query->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name');

$terms = $query->execute();

Les appels à SelectQuery :: join () (de la même manière que SelectQuery :: leftJoin () , SelectQuery :: innerJoin () et SelectQuery :: addJoin () ) ne peuvent pas être chaînés car ces méthodes ne renvoient pas d' SelectQueryobjet, mais l'alias réel utilisé pour la jointure. Si vous exécutez le code suivant, vous obtiendrez une erreur.

$query = db_select('digitaliq_flds_by_node', 'a')
  ->fields('a')
  ->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name')
  ->execute();

Les chaînes en PHP ne sont pas des objets et ne définissent pas la execute()méthode.

Pour vérifier que le code exécute la bonne requête SQL, convertissez-la $queryen chaîne et imprimez-la. Vous obtiendrez la requête SQL qui serait exécutée à partir de votre code.

$query = db_select('digitaliq_flds_by_node', 'a')->fields('a');
$alias = $query->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name');
print $query;

Avec ce code, j'obtiens la sortie suivante.

SELECT a.*
FROM 
{digitaliq_flds_by_node} a
INNER JOIN {digitaliq_fld_category} b ON a.fld_id = b.fld_id AND a.fld_collection_id = b.fld_collection_id AND a.fld_group_name = b.fld_group_name

4

Essaye ça

$query = db_select('digitaliq_flds_by_node', 'a');
$query->join('digitaliq_fld_category', 'b', 'a.fld_id = b.fld_id');
$query->condition('a.fld_collection_id', 'b.fld_collection_id' '=');
$query->condition('a.fld_group_name', 'b.fld_group_name', '=');
$query->fields('a');
$query->execute();

2
Le code que vous utilisez ne fonctionne pas: leftJoin()ne renvoie pas d' SelectQueryobjet. Le code appelle condition()quelque chose qui n'est pas un objet.
kiamlaluno

En d'autres termes, rejoindre n'est pas capable de
chaîner

@Mathankumar C'est le mot que je cherchais: appels en chaîne. :)
kiamlaluno

1
Pourtant, la réponse est incorrecte. vérifier la réponse par kiamlaluno
Mathankumar

Maintenant ça va. Remarque supplémentaire, par défaut, l'opérateur de condition est égal à (=), il n'est donc pas nécessaire de les spécifier.
Mathankumar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.