it-swarm-vi.com

Sử dụng mệnh đề IN trong db_query

Tôi không thể tìm ra cách thêm mệnh đề IN trong truy vấn của mình, sử dụng trình giữ chỗ.

Tôi muốn nó là một cái gì đó như:

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

Không thể tìm thấy bất kỳ tài liệu về nhiệm vụ đơn giản này. Cách thích hợp để đạt được điều này là gì?

37
Olof Johansson

Bạn đang thiếu niềng răng.

Thử cái này:

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

Để biết thêm thông tin, hãy xem http://drupal.org/node/310072 , đặc biệt là chương về mảng Giữ chỗ:

Mảng giữ chỗ

Lớp cơ sở dữ liệu của Drupal bao gồm một tính năng bổ sung của trình giữ chỗ. Nếu giá trị được truyền cho một trình giữ chỗ là một mảng, nó sẽ tự động được mở rộng thành một danh sách được phân tách bằng dấu phẩy như giữ chỗ tương ứng. Điều đó có nghĩa là các nhà phát triển không cần phải lo lắng về việc họ sẽ cần bao nhiêu người giữ chỗ.

Một ví dụ sẽ làm cho hành vi này rõ ràng hơn:

<?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

Cho Drupal 8

Truy vấn thực thể:

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

Truy vấn Sql (chọn), về cơ bản giống nhau cho các loại truy vấn khác.

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

Cho Drupal 7

Xem câu trả lời của Berdir.

Cho Drupal 6

Bạn có thể làm như thế này:

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

db_placeholder là cần thiết trong Drupal 6 sẽ tạo ra một chuỗi chứa các phần giữ chỗ cần thiết cho mảng các giá trị được cung cấp. Drupal 7 xử lý tất cả điều này bên trong như Berdir mô tả .

18
googletorp

Sử dụng API cơ sở dữ liệu trong Drupal 7

Đây là cách bạn có thể sử dụng db_select () thay vì db_query () cho cùng kết quả.

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

Drupal 6 Nếu mảng của bạn chứa các chuỗi bạn cần nói 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