Seleccione campos de dos tablas usando db_select ()


15

Estoy usando db_select()y no entiendo la sintaxis del fields()método. Estoy usando un join()para unirme a otra mesa. Entonces, para las mesas ty nquiero hacer 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;

yo tengo

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

Pero como puedes ver, estoy perdido en fields(). Los ejemplos que he visto solo especifican campos para una tabla:

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

¿Cuál es la sintaxis que quiero usar?

Respuestas:


28

Fácil, solo llame a fields () dos veces.

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

Puede llamar a la mayoría de los métodos varias veces (múltiples campos, múltiples condiciones, múltiples órdenes de clasificación, múltiples combinaciones, ...).

Tenga en cuenta que, como se muestra en mi ejemplo, la llamada a join () debe estar separada y no se puede "encadenar" (ese es el término técnico para tener múltiples llamadas de método en una fila) porque no devuelve el objeto de consulta sino el nombre para el alias de la tabla.


2

Una unión implícita seguirá funcionando con db_query (), si no está haciendo nada elegante. No estoy seguro si esto es una mala práctica o no. Pregunté una vez en IRC y no obtuve respuesta de nadie. Entonces, si tiene alguno de los que sobraron de D6, seguirán funcionando.


3
Usar db_query () está perfectamente bien (en realidad se recomienda por razones de rendimiento) a menos que haya una razón explícita para usar db_select (). He esbozado esas razones aquí: drupal.stackexchange.com/questions/1200/…
Berdir

¡Excelente! Fui demasiado vago para convertir el mío de todos modos. ;)
colan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.