it-swarm-id.com

Menggunakan klausa IN di db_query

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?

37
Olof Johansson

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 , terutama 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)");
?>
46
Berdir

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 bisa 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) .

18
googletorp

Menggunakan API Database di Drupal 7

Inilah cara Anda dapat menggunakan db_select () bukannya 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();
10

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
Peter Cook