it-swarm.it

Seleziona i campi da due tabelle usando db_select ()

Sto usando db_select() e non capisco la sintassi del metodo fields(). Sto usando una join() per unire un'altra tabella. Quindi per le tabelle t e n, voglio fare qualcosa del genere

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

Io ho

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

Ma come puoi vedere, mi sono perso in fields(). Gli esempi che ho visto specificano solo i campi per una tabella:

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

Qual è la sintassi che voglio usare?

15
user1359

Facile, basta chiamare i campi () due volte.

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

Puoi chiamare la maggior parte dei metodi più volte (più campi, più condizioni, più ordinamenti, più join, ...).

Si noti che, come mostrato nel mio esempio, la chiamata a join () deve essere separata e non può essere "concatenata" (questo è il termine tecnico per avere più chiamate di metodo in una riga) perché non restituisce l'oggetto query ma il nome per l'alias della tabella.

28
Berdir

Un join implicito continuerà a funzionare con db_query (), se non stai facendo nulla di speciale. Non sono sicuro se questa è una cattiva pratica o no. Ho chiesto una volta in IRC e non ho ricevuto risposta da nessuno. Quindi, se hai qualcuno di quelli rimasti da D6, funzioneranno comunque.

2
colan