一般的な概念
Drupalのデータベース層は、PHPのPDOライブラリの上に構築されています。PDOは、さまざまなデータベースにアクセスするための統合されたオブジェクト指向APIを提供しますが、異なるデータベースで使用されるさまざまなSQL方言の抽象化は提供しません。
ドライバー
異なるデータベースでは異なる種類の相互作用が必要なため、Drupalのデータベース層はデータベースタイプごとにドライバーを必要とします。ドライバーは、include/database/driver(driverはそのドライバーの一意のキーを表す文字列)にある一連のファイルで構成されます。ほとんどの場合、ドライバーキーはデータベース名の小文字バージョンです。たとえば、「mysql」「pgsql」「mycustomdriver」などです。
各ドライバーは、コアデータベースシステムの親クラスから派生した複数のクラスで構成されます。これらのドライバー固有のクラスは、そのデータベースタイプを正しくサポートするために必要な任意の動作をオーバーライドできます。ドライバー固有のクラスは、常に親クラス名の後にアンダースコア、続いてドライバー名が続くように名前が付けられます。たとえば、MySQL固有のInsertQueryのバージョンはInsertQuery_mysqlと呼ばれます。
接続
接続は、PDOクラスを継承するDatabaseConnectionクラスのオブジェクトです。Drupalが接続する各データベースには、1つの接続オブジェクトが関連付けられています。この接続オブジェクトは、個々のドライバーごとにサブクラス化する必要があります。
接続オブジェクトにアクセスする(必要に応じて開く)には、次を使用します:
$database = \Drupal::database();
// Or
$database = \Drupal::service('database');
サービスがまだ利用できない場合、\Drupal\Core\Database\Database::getConnection()を使用してデータベース接続を取得できます。
ターゲットと接続キーの詳細については、データベース設定のドキュメントページを参照してください。
現在のアクティブな接続にアクセスするには、次を使用します:
$conn = \Drupal\Core\Database\Database::getConnection() ;
これにより、アクティブな接続のデフォルトターゲットが取得されます。
ほとんどの場合、接続オブジェクトを直接リクエストする必要はないことに注意してください。むしろ、手続き型ラッパーがそれを行ってくれます。接続オブジェクトに直接アクセスする必要がある唯一の理由は、複数のデータベースで複雑な操作を実行しており、アクティブなデータベースを変更したくない場合です。
アクティブな接続を設定するには、次を使用します:
$conn = \Drupal\Core\Database\Database::setActiveConnection('external');
接続キーとターゲットの詳細については、次のセクションのデータベース設定を参照してください。
クエリ
クエリは、データベース接続に送信されるSQLステートメントです。データベースシステムは、静的、動的、挿入、更新、削除、マージの6種類のクエリをサポートしています。一部のクエリはSQL文字列テンプレート(準備済みステートメント)として記述され、他のクエリはオブジェクト指向のクエリビルダーを使用します。「クエリオブジェクト」とは、さまざまなクエリタイプのいずれかのクエリビルダーのインスタンスを指します。
ステートメント
ステートメントオブジェクトは、選択クエリの結果です。常にDatabaseStatementタイプ、または場合によってはDatabaseStatementのサブクラスになります。DatabaseStatementはPDOStatementクラスを拡張します。
Drupalはすべてのクエリで準備済みステートメントを使用します。準備済みステートメントは、実行時に値が挿入されるクエリテンプレートです。準備済みステートメントは、使用するパラメーターで呼び出されるSQL関数の等価物と考えてください。
通常のPDOでは、ステートメントオブジェクトを明示的に準備し、クエリ内のプレースホルダーにバインドされた特定の値で実行する必要があります。その後、ステートメントを結果セットとして反復処理できます。実際には、ステートメントと結果セットは同義ですが、ステートメントが実行された後でのみです。
Drupalは準備済みステートメントを直接公開しません。代わりに、モジュール開発者はクエリオブジェクトまたは使い捨てのSQL文字列を使用してクエリを実行し、そのクエリのステートメントオブジェクトが返されます。したがって、「ステートメントオブジェクト」と「結果セットオブジェクト」という用語はほぼ同義です。