logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

Drupal 7 でのデータベース操作 - レッスン 4 - 動的クエリ(SELECT)

17/04/2025, by Ivan

これで、Drupal の Database API のおそらく最も面白い部分、動的クエリ に到達しました。これらが「動的」と呼ばれるのは、Drupal がクエリ文字列をその場で組み立てるからです。INSERT、UPDATE、DELETE、MERGE のすべてのクエリは動的にできます。SELECT クエリは静的にも動的にもできます。ただし、SELECT 操作でも動的クエリを使うことが推奨されます。

すべての 動的クエリ は、必要なときに構築するクエリオブジェクトとして作成されます。静的クエリと同様に、ほとんどの動的クエリは手続き的なラッパーを使います。以降のクエリパラメーターは、メソッドチェーンを使ってクエリオブジェクトに追加されます。

db_select() SELECT クエリ

動的 SELECT クエリは db_select() 関数で始まります。たとえば:

ここで 'node' はクエリ対象のテーブルです。これは SQL の FROM 句に対応します。テーブル名は波括弧で囲まれていないことに注意してください――クエリビルダーがこれを自動的に処理します。2 番目のパラメーターはテーブルのエイリアスです。指定しない場合、テーブル名がエイリアスとして使われます。任意の $options 配列は静的クエリと同じです。

もう一つの db_select() の例

condition('u.uid', 0, '<>')
  ->fields('u', array('uid', 'name', 'status', 'created', 'access'))
  ->range(0, 50);
$result = $query->execute();
?>

これは次と同等です:

SELECT uid, name, status, created, access FROM {users} u WHERE uid > 0 LIMIT 50 OFFSET 0;

結合(JOIN)

join('user', 'u', 'n.uid = u.uid AND u.uid = :uid', array(':uid' => 5));
?>

この INNER JOIN では、エイリアス「u」を使って「user」テーブルを結合し、ON 条件にプレースホルダー値を含めています。インジェクションのリスクを避けるため、変数を SQL 文字列に直接挿入しないでください。

フィールド:addField()

addField('n', 'title', 'my_title');
?>

複数のフィールドを選択するには fields() を使います:

fields('n', array('nid', 'title', 'created', 'uid'));
?>

2 番目の引数なしで fields('n') を呼び出すと、SELECT * と同等になります。

DISTINCT

distinct();
?>

結果セットから重複する行を削除します。

式:addExpression()

addExpression('COUNT(uid)', 'uid_count');
$count_alias = $query->addExpression('created - :offset', 'uid_count', array(':offset' => 3600));
?>

ORDER BY

orderBy('title', 'DESC');
?>

ランダム順

orderRandom();
?>

これを orderBy と組み合わせられます:

orderBy('term')->orderRandom()->execute();
?>

GROUP BY

groupBy('uid');
?>

Range と Limit

range(5, 10); // Returns 10 records starting from the 6th row
?>

TableSort 拡張

extend('TableSort')
  ->orderByHeader($header);
?>

条件

WHERE 句には condition() または where() を使います。HAVING には havingCondition() または having() を使います。

クエリの実行

execute();
foreach ($result as $record) {
  // process each $record
}
?>
  • fetchField()
  • fetchAllKeyed()
  • fetchCol()

カウントクエリ

countQuery();
$num_rows = $count_query->execute()->fetchField();
?>

デバッグ

__toString());
?>