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

35

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

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

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

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

Олоф Йоханссон
источник

Ответы:

44

Вам не хватает скобок.

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

$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)");
?>
Berdir
источник
Я знал, что я был близок;) Спасибо за ответ и ссылку!
Олоф Йоханссон
как насчет строк? node_types = array('node_type_1', 'node_type_2');
Серхас,
То же самое, не имеет значения.
Бердир
18

Для Drupal 8

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

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

Sql Query (выберите), по сути то же самое для других типов запросов.

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

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

googletorp
источник
10

Использование 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();
tyler.frankenstein
источник
1

Drupal 6 Если ваш массив содержит строки, вы должны сообщить db_placeholder ()

$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);
Питер Кук
источник
-1

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

Также действует.

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();
Крис Калип
источник
db_queryустарела и будет удалена в Drupal 9. На данном этапе это не рекомендуется. Вы также не должны использовать базу данных напрямую для запроса данных, связанных с сущностями; для этого есть API
Клайв
Рекомендация строго Drupal 8 обновление. Текущий принятый ответ больше не работает для Drupal 8, потому что в нем отсутствует квадратная скобка. Отклонить этот ответ, потому что он не работает для Drupal 9, является еще одной неискренней версией. Это мешает пользователям получать ответ, который просто работает. Настроение является ярким примером того, что Совершенство - враг достаточно хорошего.
Крис Калип