Drupal 7 でのデータベース操作 - レッスン 4 - 動的クエリ(SELECT)
これで、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());
?>