Использование предложения IN в запросе бд
Я не могу понять, как добавить предложение IN в свой запрос, используя заполнители.
Я бы хотел, чтобы это было что-то вроде:
$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));
Не могу найти никакой документации по этой простой задаче. Каков правильный способ достичь этого?
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)"); ?>
Для 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 обрабатывает все это внутренне, как описывает Бердир.
Использование 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();
Друпал 6 Если ваш массив содержит строки, вам нужно сообщить db_placeholders()
$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);
Обновление Drupal 8.
Также допустимо.
$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
':nids[]' => $nids
])->fetchCol();