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?

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

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.


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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.