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?

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)");
?>

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.


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();

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);

-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();

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.