プレースホルダーを使用して、クエリにIN句を追加する方法がわかりません。
私はそれが次のようなものになりたいです:
$nids = array(1, 2, 3);
$result = db_query('SELECT * FROM {node} WHERE nid IN :nids', array(':nids' => $nids));
この単純なタスクに関するドキュメントが見つかりません。これを達成する適切な方法は何ですか?
中括弧がありません。
これを試して:
$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)"); ?>
エンティティクエリ:
$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');
...
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_query() の代わりに db_select() を使用する方法を次に示します。
$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);