web-dev-qa-db-fra.com

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

J'utilise db_select() et je ne comprends pas la syntaxe de la méthode fields(). J'utilise une join() pour rejoindre une autre table. Donc pour les tables t et n, je 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 dans 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?

15
user1359

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.

28
Berdir

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 dans IRC et je n'ai reçu de réponse de personne. Donc, si vous avez encore des restes de D6, ils fonctionneront toujours.

2
colan