Menggunakan klausa IN di db_query

35

Saya tidak tahu cara menambahkan klausa IN dalam permintaan saya, menggunakan placeholder.

Saya ingin ini seperti:

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

Tidak dapat menemukan dokumentasi tentang tugas sederhana ini. Apa cara yang tepat untuk mencapai ini?

Olof Johansson
sumber

Jawaban:

44

Anda kehilangan kawat gigi.

Coba ini:

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

Untuk informasi lebih lanjut, lihat http://drupal.org/node/310072 , khususnya bab tentang array Placeholder:

Array placeholder

Lapisan basis data Drupal mencakup fitur tambahan placeholder. Jika nilai yang dilewatkan untuk placeholder adalah array, itu akan secara otomatis diperluas ke daftar yang dipisahkan koma seperti halnya placeholder yang sesuai. Itu berarti pengembang tidak perlu khawatir tentang menghitung berapa banyak placeholder yang mereka butuhkan.

Contoh harus membuat perilaku ini lebih jelas:

<?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)");
?>
Berdir
sumber
Saya tahu saya sudah dekat;) Terima kasih atas jawabannya dan tautannya!
Olof Johansson
bagaimana dengan senar? node_types = array('node_type_1', 'node_type_2');
Serjas
Sama, tidak masalah.
Berdir
18

Untuk Drupal 8

Kueri entitas:

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

Sql Query (pilih), pada dasarnya sama untuk jenis permintaan lainnya.

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

Untuk Drupal 7

Lihat jawaban Berdir.

Untuk Drupal 6

Anda dapat melakukannya seperti ini:

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

db_placeholder diperlukan di Drupal 6 yang akan membuat string yang menampung placeholder yang diperlukan untuk array nilai yang diberikan. Drupal 7 menangani semua ini secara internal seperti yang dijelaskan Berdir.

googletorp
sumber
10

Menggunakan API Database di Drupal 7

Inilah cara Anda dapat menggunakan db_select () alih-alih db_query () untuk hasil yang sama.

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

Drupal 6 Jika array Anda berisi string, Anda perlu memberi tahu db_placeholder ()

$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);
Peter Cook
sumber
-1

Pembaruan Drupal 8.

Juga valid.

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();
Chris Calip
sumber
db_querysudah ditinggalkan dan akan dihapus dalam Drupal 9. Seharusnya tidak direkomendasikan sebagai solusi pada saat ini. Anda juga tidak boleh menggunakan database secara langsung untuk menanyakan data yang terkait dengan entitas; ada API untuk itu
Clive
Rekomendasi ini adalah pembaruan ketat Drupal 8. Jawaban yang diterima saat ini tidak lagi berfungsi untuk Drupal 8, karena tidak memiliki braket persegi. Menolak jawaban ini karena tidak berfungsi untuk Drupal 9 versi utama lainnya tidak jujur. Itu menghentikan pengguna mendapatkan jawaban yang hanya berfungsi. Sentimen adalah contoh yang jelas, Sempurna adalah musuh yang cukup baik.
Chris Calip