Sélectionnez les champs de deux tables à l'aide de db_select ()

15

J'utilise db_select()et je ne comprends pas la syntaxe de la fields()méthode. J'utilise un join()pour rejoindre une autre table. Donc pour les tables tet nje veux faire quelque chose comme

SELECT t.tid, t.field1, t.field2, n.title, n.author 
FROM table t INNER JOIN node n ON t.nid = n.nid;

j'ai

$results = db_select('table', 't')
  ->fields( ... )
  ->join('node', 'n', 'n.nid = t.nid')
  ->execute();

Mais comme vous pouvez le voir, je suis perdu fields(). Les exemples que j'ai vus ne spécifient que des champs pour une table:

->fields('t', array('tid', 'field1', 'field2'))

Quelle est la syntaxe que je veux utiliser?

user1359
la source

Réponses:

28

Facile, il suffit d'appeler champs () deux fois.

$query = db_select('table', 't');
$query->join('node', 'n', 'n.nid = t.nid');
$result = $query
  ->fields('t', array('tid', 'field1', 'field2'))
  ->fields('n', array('nid', 'field1', 'field2'))
  ->execute();

foreach ($result as $row) {
  // Do something with $row.
}

Vous pouvez appeler la plupart des méthodes plusieurs fois (plusieurs champs, plusieurs conditions, plusieurs ordres de tri, plusieurs jointures, ...).

Notez que, comme indiqué dans mon exemple, l'appel à join () doit être séparé et ne peut pas être "chaîné" (c'est le terme technique pour avoir plusieurs appels de méthode dans une rangée) car il ne renvoie pas l'objet de requête mais le nom de l'alias de table.

Berdir
la source
2

Une jointure implicite fonctionnera toujours avec db_query (), si vous ne faites rien d'extraordinaire. Je ne sais pas si c'est une mauvaise pratique ou non. J'ai demandé une fois à IRC et je n'ai reçu de réponse de personne. Donc, si vous avez encore des éléments de D6, ils fonctionneront toujours.

colan
la source
3
L'utilisation de db_query () est parfaitement correcte (elle est en fait recommandée pour des raisons de performances) sauf s'il existe une raison explicite d'utiliser db_select (). J'ai expliqué ces raisons ici: drupal.stackexchange.com/questions/1200/…
Berdir
Génial! J'étais trop paresseux pour convertir le mien de toute façon. ;)
colan