Utilisation de la clause IN dans db_query

35

Je n'arrive pas à comprendre comment ajouter une clause IN à 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));

Impossible de trouver de la documentation sur cette tâche simple. Quelle est la bonne façon d'y parvenir?

Olof Johansson
la source

Réponses:

44

Vous manquez 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 fictifs

La couche de base de données Drupal inclut une fonctionnalité supplémentaire d'espaces réservés. Si la valeur transmise pour un espace réservé est un tableau, celui-ci sera automatiquement développé en une liste séparée par des virgules, de même que l'espace réservé correspondant. Cela signifie que les développeurs n'ont pas à s'inquiéter du 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)");
?>
Berdir
la source
Je savais que j'étais proche;) Merci pour la réponse et le lien!
Olof Johansson
qu'en est-il des cordes? node_types = array('node_type_1', 'node_type_2');
Serjas
De même, ça n'a pas d'importance.
Berdir
18

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 (select), essentiellement la même chose pour les autres types de requêtes.

$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 ça:

$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, ce qui créera une chaîne contenant les espaces réservés nécessaires pour le tableau de valeurs donné. Drupal 7 gère tout cela en interne comme décrit par Berdir.

googletorp
la source
10

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

Voici comment utiliser db_select () à la place 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();
tyler.frankenstein
la source
1

Drupal 6 Si votre tableau contient des chaînes, vous devez indiquer à db_placeholders ()

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

Drupal 8 mise à jour.

Aussi valide.

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();
Chris Calip
la source
db_queryest obsolète et sera supprimé dans Drupal 9. Il ne devrait pas être recommandé comme solution à ce stade. Vous ne devez pas non plus utiliser directement la base de données pour interroger des données liées à des entités; il y a des APIs pour ça
Clive
La recommandation est strictement mise à jour Drupal 8. La réponse acceptée actuellement ne fonctionne plus pour Drupal 8, car elle manque de crochet. Rejeter cette réponse car elle ne fonctionne pas pour Drupal 9, une autre version majeure est fallacieuse. Il empêche les utilisateurs d'obtenir une réponse qui fonctionne. Le sentiment est un exemple clair de, Perfect est l'ennemi du bien suffisant.
Chris Calip