Korzystanie z klauzuli IN w db_query

35

Nie mogę wymyślić, jak dodać klauzulę IN do mojego zapytania, używając symboli zastępczych.

Chciałbym, żeby to było coś takiego:

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

Nie mogę znaleźć żadnej dokumentacji dotyczącej tego prostego zadania. Jaki jest właściwy sposób na osiągnięcie tego?

Olof Johansson
źródło

Odpowiedzi:

44

Brakuje ci nawiasów klamrowych.

Spróbuj tego:

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

Aby uzyskać więcej informacji, zobacz http://drupal.org/node/310072 , szczególnie rozdział o tablicach symboli zastępczych:

Tablice zastępcze

Warstwa bazy danych Drupal zawiera dodatkową funkcję symboli zastępczych. Jeśli wartością przekazaną dla symbolu zastępczego jest tablica, zostanie ona automatycznie rozwinięta do listy oddzielonej przecinkami, podobnie jak odpowiedni symbol zastępczy. Oznacza to, że programiści nie muszą się martwić liczeniem, ile symboli zastępczych będą potrzebować.

Przykład powinien wyjaśnić to zachowanie:

<?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
źródło
Wiedziałem, że jestem blisko;) Dzięki za odpowiedź i link!
Olof Johansson,
co ze strunami? node_types = array('node_type_1', 'node_type_2');
Serjas
To samo nie ma znaczenia.
Berdir
18

Dla Drupala 8

Zapytanie o podmiot:

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

Kwerenda SQL (wybierz), zasadniczo taka sama dla innych typów zapytań.

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

Dla Drupal 7

Zobacz odpowiedź Berdira.

Dla Drupal 6

Możesz to zrobić w następujący sposób:

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

db_placeholder jest potrzebny w Drupal 6, który utworzy ciąg znaków, który będzie zawierał symbole zastępcze potrzebne dla podanej tablicy wartości. Drupal 7 obsługuje to wszystko wewnętrznie, jak opisuje Berdir.

googletorp
źródło
10

Korzystanie z interfejsu API bazy danych w Drupal 7

Oto, w jaki sposób można użyć db_select () zamiast db_query () dla tych samych wyników.

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();
tyler.frankenstein
źródło
1

Drupal 6 Jeśli tablica zawiera ciągi, musisz poinformować db_placeholder ()

$colours = array('red', 'yellow', 'blue');
$placeholders = db_placeholders($colours,'text');
$result = db_query("SELECT * FROM {bricks} WHERE colour IN ($placeholders)", $colours);
Peter Cook
źródło
-1

Aktualizacja Drupal 8.

Również ważne.

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();
Chris Calip
źródło
db_queryjest przestarzały i zostanie usunięty w Drupal 9. W tym momencie nie powinien być zalecany jako rozwiązanie. Nie powinieneś również używać bazy danych bezpośrednio do wyszukiwania danych związanych z jednostkami; istnieją do tego interfejsy API
Clive
Zalecana jest wyłącznie aktualizacja Drupal 8. Obecna akceptowana odpowiedź nie działa już dla Drupala 8, ponieważ nie ma nawiasu kwadratowego. Odrzucić tę odpowiedź, ponieważ nie działa ona dla Drupala 9, kolejna ważna wersja jest nieuczciwa. Uniemożliwia użytkownikom uzyskanie odpowiedzi, która po prostu działa. Nastrój jest wyraźnym przykładem: Perfect jest wrogiem wystarczająco dobrego.
Chris Calip