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


35

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

Câu trả lời:


44

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

Thử đi:

$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 Placeholder:

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

Tôi biết tôi đã gần gũi;) Cảm ơn câu trả lời và liên kết!
Olof Johansson

Còn dây đàn thì sao? node_types = array('node_type_1', 'node_type_2');
Serjas

Tương tự, không quan trọng.
Berdir

18

Đối với 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');
...

Đối với Drupal 7

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

Đối với 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, nó 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ả những điều này trong nội bộ như Berdir mô tả.


10

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

1

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

Cập nhật Drupal 8.

Cũng hợp lệ.

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

db_querykhông được chấp nhận và sẽ bị xóa trong Drupal 9. Không nên sử dụng nó như một giải pháp tại thời điểm này. Bạn cũng không nên sử dụng cơ sở dữ liệu trực tiếp để truy vấn dữ liệu liên quan đến các thực thể; có API cho điều đó
Clive

Các khuyến nghị là nghiêm ngặt cập nhật Drupal 8. Câu trả lời được chấp nhận hiện tại không còn hoạt động cho Drupal 8, vì nó thiếu dấu ngoặc vuông. Để từ chối câu trả lời này bởi vì nó không hoạt động cho Drupal 9, một phiên bản chính khác là không rõ ràng. Nó ngăn người dùng nhận được một câu trả lời chỉ hoạt động. Tình cảm là một ví dụ rõ ràng về, Hoàn hảo là kẻ thù của đủ tốt.
Chris Calip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.