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

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

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

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

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

32 голоса | спросил Olof Johansson 16 J0000006Europe/Moscow 2011, 18:59:46

3 ответа


40

Вам не хватает фигурных скобок.

Попробуйте следующее:

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

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

  

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

     

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

     

Пример должен сделать это более ясным:

& л;? PHP
//Этот код:
db_query ("SELECT * FROM {node} WHERE nid IN (: nids)", массив (': nids' => array (13, 42, 144));

//Будет автоматически преобразован в этот подготовленный оператор:
db_query ("SELECT * FROM {node} WHERE nid IN (: nids_1,: nids_2,: nids_3)", массив (
  ': nids_1' => 13,
  ': nids_2' => 42,
  ': nids_3' => 144,
));

//Что эквивалентно следующему буквальному запросу:
db_query ("SELECT * FROM {node} WHERE nid IN (13, 42, 144)");
? >
ответил Berdir 16 J0000006Europe/Moscow 2011, 19:13:06
18

Для Drupal 8

Запрос объекта:

$ query = \ Drupal :: entityTypeManager () -> getStorage ('entity_type') -> getQuery ();
Условие $ query-> (поле /свойство ', [1, 2, 3],' IN ');
$ ids = $ query-> execute ();

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

$ query = \ Drupal :: database () -> select ('table', 't');
$ query-> условие ('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 обрабатывает все это внутренне, как описывает Бердир.

ответил googletorp 16 J0000006Europe/Moscow 2011, 19:27:23
6

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

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

$ nids = array (1, 2, 3);
$ query = db_select ('node', 'n')
  - > поля ( 'п')
  -> условие ('n.nid', $ nids, 'IN')
  - > выполнение ();
$ nodes = $ query-> fetchAll ();
ответил tyler.frankenstein 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 17:35:37 +0300000000pmMon, 09 Feb 2015 17:35:37 +030015 2015, 17:35:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132