Selecione campos de duas tabelas usando db_select ()


15

Estou usando db_select()e não entendo a sintaxe do fields()método. Estou usando um join()para entrar em outra tabela. Então, para tabelas te n, eu quero fazer algo como

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

eu tenho

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

Mas como você pode ver, estou perdido fields(). Os exemplos que eu vi apenas especificam campos para uma tabela:

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

Qual é a sintaxe que eu quero usar?

Respostas:


28

Fácil, basta ligar para os campos () duas vezes.

$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.
}

Você pode chamar a maioria dos métodos várias vezes (vários campos, várias condições, várias ordens de classificação, várias junções, ...).

Observe que, como mostrado no meu exemplo, a chamada para join () precisa ser separada e não pode ser "encadeada" (esse é o termo técnico para ter várias chamadas de método em uma linha) porque ela não retorna o objeto de consulta, mas o nome para o alias da tabela.


2

Uma junção implícita ainda funcionará com db_query (), se você não estiver fazendo nada sofisticado. Não tenho certeza se isso é uma prática ruim ou não. Perguntei uma vez no IRC e não recebi resposta de ninguém. Portanto, se você tiver algum que sobrou do D6, eles ainda funcionarão.


3
Usar db_query () é perfeitamente adequado (na verdade, é recomendado por razões de desempenho), a menos que haja um motivo explícito para usar db_select (). Eu esbocei essas razões aqui: drupal.stackexchange.com/questions/1200/...
Berdir

Ótimo! Eu estava com preguiça de converter o meu de qualquer maneira. ;)
Colan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.