logo

パレット - カラフルに🎨

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

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

Scroll
03/10/2019, by Ivan

Drupal でのエンティティの操作は統一されており、すべての CRUD 操作もすべてのエンティティで同じです。この記事では、カスタムコードでエンティティを扱う方法を理解します。 

まず簡単な例を見てみましょう。

プログラムでノードを作成する 

use \Drupal\node\Entity\Node;

$node = Node::create([
  'type'        => 'article',
  'title'       => 'Druplicon test',
]);
$node->save();

ノードを作成するには、必須のすべてのフィールドを追加する必要があります。デフォルトでは Title フィールドだけです。作成後にノードオブジェクトにアクセスすることもできます:

$node = Node::create([
  'type'        => 'article',
  'title'       => 'Druplicon test',
]);
$node->field_text->value = 'Simple text';
$node->save();

create() メソッドは Node.php クラスにあります。エンティティタイプが独自の create() メソッドを持っている場合は、それを使うのが最善です。ただし、エンティティを作成する汎用的な方法もあります。

$node_entity_type = \Drupal::entityTypeManager()->getDefinition('node');
$node = new Node([
  $node_entity_type->getKey('bundle') => 'movie',
  $node_entity_type->getKey('label') => 'Foo',
  'field_release_date' => '1/1/2015',
]);
$node->save();

最後に、save() メソッドを使って、エンティティを保存します。

プログラムでノード(エンティティ)を更新する

$nid = 234;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);

$node->title = 'New title';
$node->field_text = 'text';

$node->save();

エンティティフィールドの編集について詳しくは、前の記事で扱いました:

http://drupalbook.org/drupal/9111-work-entity-fields-programmatically

プログラムでノード(エンティティ)を削除する

1 つのノードを削除したい場合は、delete() メソッドを使って行えます:

$nid = 123;
$node = node_load($nid);
$node->delete();

プログラムで複数のノード(エンティティ)を作成する

多くのノードを読み込む必要がある場合、これを 1 つずつ行うのはコストがかかります。というのも、各ノードにはフィールドがあり、データベースからデータを読み込むには多くの SQL クエリを実行する必要があるからです。すべてのノードを一度に読み込むほうがはるかに速いです:

$nids = db_select('node_field_data', 'n')
  ->fields('n', ['nid'])
  ->condition('title', $my_title)
  // The node_access tag will check access rights.
  ->addTag('node_access')
  ->execute()
  ->fetchCol();

$nodes = Node::loadMultiple($nids);

プログラムで複数のノード(エンティティ)を削除する

$result = \Drupal::entityQuery("node")
  ->condition('created', strtotime('-30 days'), '<=')
  ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);