Drupal 7 でのデータベース操作 - レッスン 9 - UPDATE クエリ
更新クエリは常にクエリビルダーを使うべきです。データベースによって LOB(Large Object、MySQL の TEXT など)や BLOB(Binary Large Object)フィールドの特定のハンドラーが異なるため、個々のデータベースドライバーがこれらの特有の処理を実装できるように、抽象化レイヤーが必要です。
更新クエリは db_update() 関数で始める必要があります:
この更新クエリオブジェクトを作成することで、node テーブルの 1 つ以上のレコードを変更します。波括弧は不要であることに注意してください――クエリビルダーが自動的にテーブル名を処理します。
更新クエリオブジェクトは Fluent API を使います。つまり、(execute() を除く)すべてのメソッドがクエリオブジェクト自体を返し、メソッドチェーンを可能にします。多くの場合、これはクエリを変数に格納する必要がないことを意味します。
更新クエリは分かりやすく、設定するキー/値のペアのセットと、WHERE 条件のセットで構成されます。WHERE 句の完全な構造は後のレッスンで詳しく探ります――ここでは軽く触れるだけです。
典型的な更新クエリは次のようになります:
fields(array(
'uid' => 5,
'status' => 1,
))
->condition('created', REQUEST_TIME - 3600, '>=')
->execute();
?>
この例は次の SQL クエリと同等です:
UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;
上記の例は、過去 1 時間以内に作成された node テーブルのすべてのレコードを更新し、それらの uid を 5 に、status を 1 に設定します。fields() メソッドは、どのフィールドを更新するかと、割り当てる新しい値を指定する連想配列を取ります。insert クエリとは異なり、UpdateQuery::fields() は連想配列のみをサポートすることに注意してください。また、配列内のフィールドの順序や、メソッド呼び出しの順序は問題になりません。
execute() メソッドは、クエリによって更新された行数を返します。「更新された」とは、WHERE 条件に一致したすべての行を意味するわけではないことに注意してください。たとえば、一部のノードがすでに uid=5 と status=1 を持っている場合、それらは WHERE 条件に一致するかもしれませんが、値がすでに一致しているため変更されません。したがって、更新クエリは、現在いくつの行が指定された値に一致するかを常に正確に反映するわけではありません。