web-dev-qa-db-ja.com

コードでデータベースクエリを実行するにはどうすればよいですか?

SELECT nid FROM node WHERE type = "blablabla"などが必要です。

Drupal 8 PHPコードでこれをどのように行うのですか?

5
elterr1ble

データベース抽象化レイヤー を使用します。

_$query = \Drupal::database()->select('node', 'n');
$query->addField('n', 'nid');
$query->condition('n.type', 'blablabla');
$results = $query->execute();
_

クエリの実行に関しては、 さまざまな方法で結果を取得する を使用することもできます。

例:

_$query = \Drupal::database()->select('node', 'n');
$query->addField('n', 'nid');
$query->condition('n.type', 'blablabla');
$results = $query->execute()->fetchAll();


$query = \Drupal::database()->select('node', 'n');
$query->addField('n', 'nid');
$query->condition('n.type', 'blablabla');
$results = $query->execute()->fetchAllAssoc('nid');
_

クラス内にいる場合は、静的なDrupalコンテナーを使用する代わりに、コンストラクターに適切なクラスを注入する必要があります。ただし、前処理関数にいるため、\Drupal::database()は大丈夫。

_core/lib/Drupal.php_から:

_ /**
   * Returns the current primary database.
   *
   * @return \Drupal\Core\Database\Connection
   *   The current active database's master connection.
   */
  public static function database() {
    return static::getContainer()->get('database');
  }
_

ユースケースに応じて、 EntityQuery を活用することもできます。

_$query = \Drupal::entityQuery('node');
$query->condition('type', 'blablabla');
$results = $query->execute();
_

nodeの代わりに_node_field_data_テーブルを使用することもできますが、クエリは非常に汎用的であるため、より優れたクエリがないとわかりにくいことに注意してください。

例:パブリッシュされたタイプのすべてのノードを取得します。

_$query = \Drupal::database()->select('node_field_data', 'nfd');
$query->addField('nfd', 'nid');
$query->condition('nfd.type', 'blablabla');
$query->condition('nfd.status', 1);
$results = $query->execute();
_

または:

_$query = \Drupal::entityQuery('node');
$query->condition('type', 'blablabla');
$query->condition('status', 1);
$results = $query->execute();
_
14
Kevin