Использование предложения IN в запросе бд


Я не могу понять, как добавить предложение IN в свой запрос, используя заполнители.

Я бы хотел, чтобы это было что-то вроде:

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

Не могу найти никакой документации по этой простой задаче. Каков правильный способ достичь этого?

 38
Author: kiamlaluno, 2011-06-16

5 answers

У вас отсутствуют фигурные скобки.

Попробуйте это:

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

Для получения дополнительной информации см. http://drupal.org/node/310072 , особенно глава о массивах заполнителей:

Массивы заполнителей

Уровень базы данных Drupal включает дополнительную функцию заполнителей. Если значение, переданное для заполнителя, является массивом, оно будет автоматически развернуто в список, разделенный запятыми, как и соответствующий заполнитель. Это означает, что разработчики не нужно беспокоиться о том, чтобы подсчитать, сколько заполнителей им понадобится.

Пример должен прояснить это поведение:

<?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)");
?>
 47
Author: Berdir, 2011-06-16 15:13:06

Для Drupal 8

Запрос сущности:

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

Sql-запрос (select), по сути, такой же для других типов запросов.

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

Для Drupal 7

Смотрите ответ Бердира.

Для Drupal 6

Вы можете сделать это так:

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

Db_placeholders необходим в Drupal 6, который создаст строку, содержащую заполнители, необходимые для заданного массива значений. Drupal 7 обрабатывает все это внутренне, как описывает Бердир.

 18
Author: googletorp, 2016-03-15 08:26:23

Использование API базы данных в Drupal 7

Вот как вы можете использовать db_select() вместо db_query() для тех же результатов.

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();
 11
Author: tyler.frankenstein, 2015-02-09 14:35:37

Друпал 6 Если ваш массив содержит строки, вам нужно сообщить db_placeholders()

$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);
 1
Author: Peter Cook, 2019-05-14 23:29:44

Обновление Drupal 8.

Также допустимо.

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();
 -1
Author: Chris Calip, 2019-11-08 22:07:07