在db_query中使用IN子句


35

我不知道如何使用占位符在查询中添加IN子句。

我希望它是这样的:

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

找不到有关此简单任务的任何文档。实现此目的的正确方法是什么?

Answers:


44

您缺少括号。

尝试这个:

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

有关更多信息,请参见http://drupal.org/node/310072,尤其是有关占位符数组的章节:

占位符数组

Drupal的数据库层包括占位符的额外功能。如果为占位符传递的值是数组,则它将自动扩展为逗号分隔的列表,以及相应的占位符。这意味着开发人员无需担心需要多少个占位符。

一个示例应使这种行为更清晰:

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

我知道我接近了;)感谢您的回答和链接!
奥洛夫·约翰逊

弦呢?node_types = array('node_type_1', 'node_type_2');
Serjas

一样,没关系。
Berdir

18

对于Drupal 8

实体查询:

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

Sql Query(选择),与其他查询类型基本相同。

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

对于Drupal 7

请参阅Berdir的答案。

对于Drupal 6

您可以这样做:

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

在Drupal 6中需要db_placeholders,它将创建一个字符串,该字符串包含给定值数组所需的占位符。Drupal 7像Berdir描述的那样在内部处理所有这些问题。



1

Drupal 6 如果您的数组包含字符串,则需要告诉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更新。

也有效。

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

db_query已被弃用,并将在Drupal 9中删除。目前不建议将其作为解决方案。您也不应直接将数据库用于查询与实体相关的数据。有API
Clive

推荐严格是Drupal 8更新。当前接受的答案不再适用于Drupal 8,因为它没有方括号。拒绝此答案是因为它不适用于Drupal 9,另一个主要版本不可靠。它使用户无法获得正确的答案。情感就是一个明显的例子,完美是足够好的敌人。
克里斯·卡利普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.