db_queryでIN句を使用する


35

プレースホルダーを使用して、クエリにIN句を追加する方法がわかりません。

私はそれが次のようなものになりたいです:

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

この簡単なタスクに関するドキュメントは見つかりません。これを達成する適切な方法は何ですか?

回答:


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');
セルハス

同じ、問題ではない。
ベルディール

18

Drupal 8の場合

エンティティクエリ:

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

SQLクエリ(選択)。他のクエリタイプと基本的に同じです。

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

db_placeholdersは、指定された値の配列に必要なプレースホルダーを保持する文字列を作成するDrupal 6で必要です。Drupal 7は、Berdirが説明するように、これらすべてを内部的に処理します。


10

Drupal 7でデータベースAPIを使用する

同じ結果を得るために、db_query()の代わりにdb_select()を使用する方法を次に示します。

$nids = array(1, 2, 3);
$query = db_select('node', 'n')
  ->fields('n')
  ->condition('n.nid', $nids, 'IN')
  ->execute();
$nodes = $query->fetchAll();

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では機能しないため、この回答を拒否することは、別のメジャーバージョンが不誠実であることです。ユーザーがうまく機能する答えを得るのを止めます。感情は明確な例であり、パーフェクトは十分な敵です。
クリスカリプ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.