it-swarm-eu.dev

Použití klauzule IN v db_query

Nemůžu přijít na to, jak přidat klauzuli IN do mého dotazu pomocí zástupných symbolů.

Chtěl bych, aby to bylo něco jako:

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

Nelze najít žádnou dokumentaci k tomuto jednoduchému úkolu. Jaký je správný způsob, jak toho dosáhnout?

35
Olof Johansson

Chybí vám rovnátka.

Zkuste to:

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

Další informace viz http://drupal.org/node/310072 , zejména kapitola o zástupných symbolech:

Zástupný symbol

Vrstva databáze Drupalu obsahuje další funkci zástupných symbolů. Pokud je předaná hodnota pro zástupný symbol pole, bude automaticky rozbalena do seznamu odděleného čárkami stejně jako odpovídající zástupný symbol. To znamená, že vývojáři se nemusí starat o počítání, kolik zástupných symbolů bude potřebovat.

Příklad by měl objasnit toto chování:

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

Pro Drupal 8

Dotaz na entitu:

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

Sql Query (výběr), v podstatě stejný pro ostatní typy dotazů.

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

Pro Drupal 7

Viz Berdirova odpověď.

Pro Drupal 6)

Můžete to udělat takto:

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

db_placeholder je potřebný v Drupal 6, který vytvoří řetězec, který drží zástupné symboly potřebné pro pole zadaných hodnot. Drupal 7 zpracovává vše interně, jak popisuje Berdir) .

18
googletorp

Použití databázového API v Drupal 7

Takto můžete použít db_select () místo db_query () pro stejné výsledky.

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();
10

Drupal 6 Pokud vaše pole obsahuje řetězce, musíte říct db_placeholder ()

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