我不知道如何使用占位符在查询中添加IN子句。
我希望它是这样的:
$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));
找不到有关此简单任务的任何文档。实现此目的的正确方法是什么?
我不知道如何使用占位符在查询中添加IN子句。
我希望它是这样的:
$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));
找不到有关此简单任务的任何文档。实现此目的的正确方法是什么?
Answers:
您缺少括号。
尝试这个:
$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');
实体查询:
$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');
...
请参阅Berdir的答案。
您可以这样做:
$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描述的那样在内部处理所有这些问题。
这是使用db_select()而不是db_query()获得相同结果的方法。
$nids = array(1, 2, 3);
$query = db_select('node', 'n')
->fields('n')
->condition('n.nid', $nids, 'IN')
->execute();
$nodes = $query->fetchAll();
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);
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