logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll

9.13. Drupal でのデータベースの操作

03/10/2019, by Ivan

Drupal モジュールの開発で実行するのはよくあるケースです。可能な場合は entityQuery を使うべきですが、より高度なデータを取得するために SQL クエリを使う必要があることもあります。

Drupal で select、insert、update、delete の MySQL クエリを実行する方法のチートシートをいつでも手元に置けるように、このページをブックマークに追加できます。

Select

単一の値を取得する:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();

エントリーを配列で取得する:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();

エントリーをオブジェクトで取得するには、->fetchObject()、->fetchAll() を使うこともできます。

クエリで LIKE を使う:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();

JOIN を使った select クエリ:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');

以下は、その他のデータベースクエリ insert、update、upsert、delete の例です。これらのクエリはカスタムテーブルを扱うのに役立ちます。しかし、カスタムテーブルを使う前によく考えたほうが良いでしょう。Drupal API や contrib モジュールを使うほうが良いです。しかし、それでもデータベースへのカスタムクエリを書くと決めた場合は、以下に例があります:

Insert

$query = \Drupal::database()->insert('flood');
$query->fields([
  'event',
  'identifier'
]);
$query->values([
  'My event',
  'My indentifier'
]);
$query->execute();

一度に複数のレコードを挿入するには、values() を複数回呼び出せます。

Update

$query = \Drupal::database()->update('flood');
$query->fields([
  'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();

Upsert

$query = \Drupal::database()->upsert('flood');
$query->fields([
  'fid',
  'identifier',
]);
$query->values([
  1,
  'My indentifier for upsert'
]);
$query->key('fid');
$query->execute();

key() メソッドは、既存のレコードを判断するために使われるフィールドの名前を記述するために使うべきです。condition() を書く必要はなく、key() メソッドを使えます。key() メソッドで使うフィールドは一意でなければなりません。例えば、nid、uid、tid、fid、その他のエンティティの ID のように。キーが存在しない場合は、レコードを更新する代わりに、指定されたキーで新しいレコードが挿入されます。

Delete

$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();

以上です。もっと例が必要なら、コメントに書いてください。次のチュートリアルでは、カスタムの Drupal データベースクエリを実際にどう使うかを見ていきます。