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?

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

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.


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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.