Seleziona i campi da due tabelle usando db_select ()


15

Sto usando db_select()e non capisco la sintassi del fields()metodo. Sto usando a join()per unirmi a un altro tavolo. Quindi per i tavoli te 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 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?

Risposte:


28

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.


2

Un join implicito funzionerà comunque 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 dalla D6, funzioneranno comunque.


3
L'uso di db_query () è perfettamente corretto (in realtà è consigliato per motivi di prestazioni) a meno che non vi sia un motivo esplicito per l'utilizzo di db_select (). Ho delineato questi motivi qui: drupal.stackexchange.com/questions/1200/…
Berdir

Grande! Ero troppo pigro per convertire il mio comunque. ;)
colan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.