Scroll
データベース接続オブジェクトの作成
データベースとのやり取りは、データベース接続オブジェクトを介して行う必要があります。注意が必要なシナリオがいくつかあります:
1. 手続き型コード(*.module、*.inc、またはスクリプトファイル)の場合:
データベース接続オブジェクトのインスタンスを作成する最良の方法は、Service Containerを介する方法です。
例:
$database = \Drupal::database();
// Or
$database = \Drupal::service('database');
これにより、settings.phpファイルのデータベース設定で定義されているように、デフォルトのメインデータベースに接続するように構成されたデータベース接続オブジェクトが取得されます。
2. 歴史的および技術的な理由により、\Drupal::database()が返す型は\Drupal\Core\Database\Connectionであり、そのため$connectionと呼ばれることもあります。
3. OOPコードの場合:
- 場合によっては、データベース接続オブジェクトが現在のクラスのメンバーとしてすでに利用可能なことがあります。たとえば、多くのプラグインやサービスは、メンバーとして$this->database(または$this->connection)を持っています。
- 可能であれば、DI(依存性注入)を使用して@databaseサービスまたは$container->get('database')を使用し、データベース接続を注入します。
- それが不可能な場合(クラスの静的メソッドなど)は、\Drupal::database()を使用します。
- サービスがまだ利用できない場合、\Drupal\Core\Database\Database::getConnection()を使用してデータベース接続を取得できます。
- ユニットテストでは、読み込まれたカーネルや組み込みコンテナーがありません。ユニットテストは通常、データベースにアクセスすべきではありません。データベースサービスを必要とするユニットテストは、カーネルテストに変換する必要があります。
- カーネルテストと機能テストのクラスでは、$this->container->get('database')を使用できます。テスト作成者によっては、機能テスト中のリクエスト時にテストクラスが参照するコンテナーが現在のコンテナーと同期されないことに気付く場合があります。この場合、テスト作成者は$this->rebuildContainer()を呼び出してから、$this->container->get('database')に再度アクセスできます。
別のデータベース接続の使用
サイトで複数のデータベースを使用している場合、デフォルト以外のデータベースに対してクエリを実行するには、Database::getConnection()を使用します。例:
$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');
これにより、settings.phpで次のように定義されたデータベースへの接続が提供されます:
$databases['other_database']['default']