Pilih bidang dari dua tabel menggunakan db_select ()

15

Saya menggunakan db_select()dan saya tidak mengerti sintaks fields()metode ini. Saya menggunakan a join()untuk bergabung dengan tabel lain. Jadi untuk meja tdan n, saya ingin melakukan sesuatu seperti

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

saya sudah

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

Tapi seperti yang Anda lihat, saya bingung fields(). Contoh yang saya lihat hanya menentukan bidang untuk satu tabel:

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

Sintaks apa yang ingin saya gunakan?

pengguna1359
sumber

Jawaban:

28

Mudah, cukup panggil bidang () dua kali.

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

Anda dapat memanggil sebagian besar metode beberapa kali (beberapa bidang, beberapa kondisi, beberapa urutan, beberapa gabungan, ...).

Perhatikan bahwa, seperti yang ditunjukkan dalam contoh saya, panggilan untuk bergabung () perlu dipisah dan tidak dapat "dirantai" (itulah istilah teknis untuk memiliki beberapa metode panggilan berturut-turut) karena tidak mengembalikan objek permintaan tetapi nama untuk alias tabel.

Berdir
sumber
2

Gabung implisit masih akan bekerja dengan db_query (), jika Anda tidak melakukan sesuatu yang mewah. Saya tidak yakin apakah ini praktik yang buruk atau tidak. Saya pernah bertanya di IRC dan tidak mendapat tanggapan dari siapa pun. Jadi, jika Anda memiliki yang tersisa dari D6, mereka akan tetap berfungsi.

colan
sumber
3
Menggunakan db_query () tidak masalah (sebenarnya disarankan untuk alasan kinerja) kecuali ada alasan eksplisit untuk menggunakan db_select (). Saya telah menjabarkan alasan-alasan itu di sini: drupal.stackexchange.com/questions/1200/…
Berdir
Bagus! Saya terlalu malas untuk mengubah milik saya. ;)
colan