Utilizzo della clausola IN in db_query


35

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?

Risposte:


44

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 trasmesso per un segnaposto è un array, verrà automaticamente espanso in un elenco separato da virgole così 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)");
?>

Sapevo di essere vicino;) Grazie per la risposta e il link!
Olof Johansson,

che dire delle corde? node_types = array('node_type_1', 'node_type_2');
Serjas,

Lo stesso, non importa.
Berdir,

18

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_placeholder è 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 descritto da Berdir.


10

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

1

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

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

-1

Aggiornamento di Drupal 8.

Valido anche

$nids = db_query("SELECT nid FROM node_field_data WHERE nid IN (:nids[]) AND status = 1", [
  ':nids[]' => $nids
])->fetchCol();

db_queryè obsoleto e verrà rimosso in Drupal 9. A questo punto non dovrebbe essere raccomandato come soluzione. Inoltre, non è necessario utilizzare il database direttamente per eseguire query sui dati relativi alle entità; ci sono API per questo
Clive

La raccomandazione è strettamente l'aggiornamento Drupal 8. La risposta attualmente accettata non funziona più per Drupal 8, perché manca di parentesi quadre. Rifiutare questa risposta perché non funziona per Drupal 9, un'altra versione principale è disingenua. Impedisce agli utenti di ottenere una risposta che funziona. Il sentimento è un chiaro esempio di, Perfect è il nemico del abbastanza buono.
Chris Calip,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.