การใช้ IN clause ใน db_query


35

ฉันไม่สามารถหาวิธีเพิ่มส่วนคำสั่ง IN ในข้อความค้นหาของฉันได้โดยใช้ตัวยึด

ฉันต้องการให้มันเป็นเช่น:

$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));

ไม่พบเอกสารใด ๆ ในภารกิจง่าย ๆ นี้ วิธีที่เหมาะสมในการบรรลุสิ่งนี้คืออะไร?

คำตอบ:


44

คุณไม่มีวงเล็บปีกกา

ลองสิ่งนี้:

$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN (:nids)', array(':nids' => $nids));

สำหรับข้อมูลเพิ่มเติมดูที่http://drupal.org/node/310072โดยเฉพาะอย่างยิ่งในบทเกี่ยวกับตัวยึดตำแหน่ง:

ตัวยึดอาร์เรย์

เลเยอร์ฐานข้อมูลของ Drupal มีคุณสมบัติพิเศษของตัวยึดตำแหน่ง หากค่าที่ส่งผ่านสำหรับตัวยึดตำแหน่งเป็นอาร์เรย์ค่านั้นจะถูกขยายเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคโดยอัตโนมัติเช่นเดียวกับตัวยึดตำแหน่งที่สอดคล้องกัน นั่นหมายความว่านักพัฒนาไม่จำเป็นต้องกังวลเกี่ยวกับการนับจำนวนตัวยึดตำแหน่งที่พวกเขาต้องการ

ตัวอย่างควรทำให้พฤติกรรมนี้ชัดเจนขึ้น:

<?php
// This code:
db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144));

// Will get turned into this prepared statement equivalent automatically:
db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array(
  ':nids_1' => 13, 
  ':nids_2' => 42, 
  ':nids_3' => 144,
));

// Which is equivalent to the following literal query:
db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)");
?>

ฉันรู้ว่าฉันอยู่ใกล้;) ขอบคุณสำหรับคำตอบและลิงค์!
Olof Johansson

แล้วสตริงล่ะ? node_types = array('node_type_1', 'node_type_2');
Serjas

เหมือนกันไม่สำคัญ
Berdir

18

สำหรับ Drupal 8

ข้อความค้นหาเอนทิตี:

$query = \Drupal::entityTypeManager()->getStorage('entity_type')->getQuery();
$query->condition('field/property', [1, 2, 3], 'IN');
$ids = $query->execute();

Query Query (เลือก) เป็นหลักสำหรับแบบสอบถามชนิดอื่น

$query = \Drupal::database()->select('table', 't');
$query->condition('column', [1, 2, 3], 'IN');
...

สำหรับ Drupal 7

ดูคำตอบของ Berdir

สำหรับ Drupal 6

คุณสามารถทำสิ่งนี้ได้:

$nids = array(1, 2, 3);
$placeholders = db_placeholders($nids);
$result = db_query("SELECT * FROM {node} WHERE nid IN ($placeholders)", $nids);

db_placeholders จำเป็นต้องมีใน Drupal 6 ซึ่งจะสร้างสตริงที่เก็บตัวแทนที่จำเป็นสำหรับอาร์เรย์ของค่าที่กำหนด Drupal 7 จัดการทั้งหมดนี้ภายในเหมือน Berdir อธิบาย


10

การใช้ Database API ใน Drupal 7

นี่คือวิธีที่คุณสามารถใช้db_select ()แทนที่จะเป็นdb_query ()สำหรับผลลัพธ์เดียวกัน

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();


-1

อัพเดต Drupal 8

ใช้ได้อีกด้วย

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();

db_queryเลิกใช้แล้วและจะถูกลบใน Drupal 9 ไม่ควรแนะนำเป็นวิธีแก้ปัญหา ณ จุดนี้ คุณไม่ควรใช้ฐานข้อมูลโดยตรงสำหรับการสืบค้นข้อมูลที่เกี่ยวข้องกับเอนทิตี มี API สำหรับสิ่งนั้น
ไคลฟ์

คำแนะนำเป็นการอัปเดตของ Drupal 8 อย่างเคร่งครัด คำตอบที่ได้รับการยอมรับในปัจจุบันไม่สามารถใช้งานกับ Drupal 8 ได้อีกต่อไปเพราะไม่มีวงเล็บเหลี่ยม หากต้องการปฏิเสธคำตอบนี้เพราะมันไม่สามารถใช้งานได้กับ Drupal 9 รุ่นใหญ่อื่นก็ไม่เห็นด้วย มันหยุดผู้ใช้รับคำตอบที่เพิ่งทำงาน ความเชื่อมั่นเป็นตัวอย่างที่ชัดเจนว่าสมบูรณ์แบบคือศัตรูที่ดีพอ
Chris Calip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.