ในตัวอย่างเฉพาะคุณควรเขียนเงื่อนไขดังนี้:
$query->condition('n.language', 'ab', '<>');
ในกรณีทั่วไปที่คุณต้องเลือกแถวในฐานข้อมูลโดยยึดตามค่าที่ส่งคืนจากแบบสอบถามย่อยคุณควรพิจารณาสิ่งต่อไปนี้:
"ไม่อยู่ใน" SelectQuery::condition()
ได้รับการยอมรับเป็นผู้ประกอบการจาก อันที่จริงแล้วแบบสอบถามต่อไปนี้จะถูกดำเนินการ:
$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);
}
ตามที่รายงานไว้ในข้อเงื่อนไข ("Subselects") SelectQuery::condition()
ยอมรับวัตถุที่ใช้SelectQueryInterface
เป็นค่า$value
เช่นคืนโดยdb_select()
; ปัญหาคือว่าจริง ๆ แล้วคุณก็สามารถใช้มันเมื่อค่าของมีค่าเท่ากับ$operator
"IN"
ดูsubselects จะไม่ได้ทำงานในสภาพ DBTNG ยกเว้นเมื่อใช้เป็นค่าสำหรับ IN
วิธีเดียวที่ฉันสามารถเห็นการใช้ตัวดำเนินการ "ไม่ได้อยู่ใน" กับแบบสอบถามย่อยในcondition
คือ:
- ดำเนินการแบบสอบถามย่อยเพื่อรับอาร์เรย์
เรียกใช้งานเคียวรีหลักเพื่อตั้งเงื่อนไขเช่นเดียวกับข้อมูลโค้ดต่อไปนี้
$query->condition($key, $subquery_result, 'NOT IN');
$subquery_result
เป็นอาร์เรย์ที่มีผลลัพธ์ของแบบสอบถามย่อย
มิฉะนั้นคุณสามารถใช้where()
ตามที่คนอื่นพูดซึ่งยอมรับสตริงสำหรับส่วนของแบบสอบถามที่คุณต้องการเพิ่ม
โปรดจำไว้ว่าdb_select()
ช้าลงdb_query()
; คุณควรใช้คำสั่งแรกเมื่อคุณรู้ว่าอาจมีการเปลี่ยนแปลงโมดูลอื่น ๆ มิฉะนั้นถ้าโมดูลอื่น ๆ ไม่ควรที่จะใช้ในการปรับเปลี่ยนการค้นหาของคุณคุณควรใช้hook_query_alter()
ในกรณีของการเข้าถึงโหนดถ้าคุณต้องการที่จะได้รับเพียงโหนดที่ผู้ใช้มีการเข้าถึงจากนั้นคุณจำเป็นต้องใช้และเพิ่มเป็นแท็กของแบบสอบถามที่มี ตัวอย่างเช่นใช้รหัสต่อไปนี้db_query()
db_select()
'node_access'
SelectQuery::addTag()
blog_page_last()
$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();
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'
?