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
Kiran Kumar
la source

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
kiamlaluno
la source
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();
Sathiya
la source
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