Dalam contoh spesifik, Anda cukup menuliskan kondisinya sebagai:
$query->condition('n.language', 'ab', '<>');
Dalam kasus umum, di mana Anda harus memilih baris dalam basis data berdasarkan nilai yang dikembalikan dari sub-kueri, Anda harus mempertimbangkan apa yang berikut:
"NOT IN" diterima sebagai operator dari SelectQuery::condition()
. Bahkan, permintaan berikut akan dieksekusi:
$query = db_select('node', 'n')->fields('n');
$query->condition('n.nid', array(1, 2, 3), 'NOT IN');
$nodes = $query->execute();
foreach ($nodes as $node) {
dsm($node->nid);
}
Seperti yang dilaporkan dalam klausa Bersyarat ("Subselects"), SelectQuery::condition()
menerima juga objek yang mengimplementasikan SelectQueryInterface
sebagai nilai untuk $value
, seperti yang dikembalikan oleh db_select()
; masalahnya adalah bahwa sebenarnya Anda bisa menggunakannya ketika nilai $operator
sama dengan "IN"
. Lihat Subselek tidak berfungsi dalam kondisi DBTNG, kecuali bila digunakan sebagai nilai untuk IN .
Satu-satunya cara saya dapat melihat untuk menggunakan operator "TIDAK DALAM" dengan sub-kueri condition
adalah dengan:
- Jalankan subquery untuk mendapatkan array
Jalankan query utama yang mengatur kondisi seperti pada cuplikan berikut
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
adalah array yang berisi hasil dari sub-query.
Jika tidak, Anda bisa menggunakan where()
seperti kata orang lain, yang menerima string untuk bagian dari kueri yang perlu Anda tambahkan.
Ingatlah bahwa db_select()
itu lebih lambat db_query()
; Anda harus menggunakan yang pertama saat Anda tahu kueri dapat diubah oleh modul lain. Jika tidak, jika modul lain tidak seharusnya digunakan hook_query_alter()
untuk mengubah kueri Anda, Anda harus menggunakan db_query()
.
Dalam hal mengakses node, jika Anda hanya perlu mendapatkan node yang dapat diakses oleh pengguna, maka Anda harus menggunakan db_select()
dan menambahkan 'node_access'
sebagai tag kueri, dengan SelectQuery::addTag()
. Misalnya, blog_page_last()
gunakan kode berikut.
$query = db_select('node', 'n')->extend('PagerDefault');
$nids = $query
->fields('n', array('nid', 'sticky', 'created'))
->condition('type', 'blog')
->condition('status', 1)
->orderBy('sticky', 'DESC')
->orderBy('created', 'DESC')
->limit(variable_get('default_nodes_main', 10))
->addTag('node_access')
->execute()
->fetchCol();
Kode serupa digunakan oleh book_block_view()
.
$select = db_select('node', 'n')
->fields('n', array('title'))
->condition('n.nid', $node->book['bid'])
->addTag('node_access');
$title = $select->execute()->fetchField();
SELECT nid FROM node WHERE language != 'ab'
?