Використання пункту 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)");
?>

Я знав, що я поруч;) Дякую за відповідь та посилання!
Олоф Йоханссон

як щодо струн? node_types = array('node_type_1', 'node_type_2');
Serjas

Те ж, не має значення.
Бердір

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

db_placeholders потрібен в Drupal 6, який створить рядок, який містить заповнювачі, необхідні для масиву заданих значень. Drupal 7 обробляє все це внутрішньо, як описує Бердір.


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

1

Drupal 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

Оновлення 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
Clive

Рекомендація суворо оновлена ​​Drupal 8. Поточна прийнята відповідь більше не працює для Drupal 8, оскільки їй бракує квадратної дужки. Відхиляти цю відповідь, оскільки вона не працює для Drupal 9, інша основна версія - нечесна. Це зупиняє користувачів на отримання відповіді, яка просто працює. Настрій є наочним прикладом того, що Ідеальний є ворогом достатньо добра.
Кріс Каліп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.