web-dev-qa-db-fra.com

Utilisation de la clause IN dans db_query

Je ne peux pas comprendre comment ajouter une clause IN dans ma requête, en utilisant des espaces réservés.

Je voudrais que ce soit quelque chose comme:

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

Je ne trouve aucune documentation sur cette tâche simple. Quelle est la bonne façon d'y parvenir?

37
Olof Johansson

Il vous manque les accolades.

Essaye ça:

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

Pour plus d'informations, voir http://drupal.org/node/310072 , en particulier le chapitre sur les tableaux d'espace réservé:

Tableaux d'espace réservé

La couche de base de données de Drupal comprend une fonctionnalité supplémentaire d'espaces réservés. Si la valeur transmise pour un espace réservé est un tableau, elle sera automatiquement développée dans une liste séparée par des virgules, tout comme l'espace réservé correspondant. Cela signifie que les développeurs n'ont pas à se soucier de compter le nombre d'espaces réservés dont ils auront besoin.

Un exemple devrait rendre ce comportement plus clair:

<?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

Pour Drupal 8

Requête d'entité:

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

Requête SQL (sélectionner), essentiellement la même pour les autres types de requête.

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

Pour Drupal 7

Voir la réponse de Berdir.

Pour Drupal 6

Vous pouvez le faire comme ceci:

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

db_placeholders est nécessaire dans Drupal 6 qui créera une chaîne qui contient les espaces réservés nécessaires pour le tableau de valeurs donné. Drupal 7 gère tout cela en interne comme Berdir le décrit) .

18
googletorp

Utilisation de l'API de base de données dans Drupal 7

Voici comment utiliser db_select () au lieu de db_query () pour les mêmes résultats.

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

Drupal 6 Si votre tableau contient des chaînes, vous devez le 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