it-swarm.it

Utilizzo della clausola IN in db_query

Non riesco a capire come aggiungere una clausola IN alla mia query, usando i segnaposto.

Vorrei che fosse qualcosa del tipo:

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

Non è possibile trovare documentazione su questa semplice attività. Qual è il modo corretto per raggiungere questo obiettivo?

37
Olof Johansson

Ti mancano le parentesi graffe.

Prova questo:

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

Per ulteriori informazioni, consultare http://drupal.org/node/310072 , in particolare il capitolo sugli array segnaposto:

Matrici segnaposto

Il livello del database di Drupal include una funzionalità aggiuntiva di segnaposto. Se il valore passato per un segnaposto è un array, verrà automaticamente espanso in un elenco separato da virgole come il segnaposto corrispondente. Ciò significa che gli sviluppatori non devono preoccuparsi di contare quanti segnaposto avranno bisogno.

Un esempio dovrebbe rendere più chiaro questo comportamento:

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

Per Drupal 8

Query entità:

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

Query SQL (seleziona), sostanzialmente uguale per altri tipi di query.

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

Per Drupal 7

Vedi la risposta di Berdir.

Per Drupal 6

Puoi farlo in questo modo:

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

db_placeholders è necessario in Drupal 6 che creerà una stringa che contiene i segnaposto necessari per l'array di valori forniti. Drupal 7 gestisce tutto ciò internamente come Berdir descrive .

18
googletorp

Utilizzo dell'API del database in Drupal 7

Ecco come puoi usare db_select () invece di db_query () per gli stessi risultati.

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

Drupal 6 Se l'array contiene stringhe devi dire db_placeholders ()

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