12.11.2. Создание, обновление, удаление Entity.

Drupal 8 logo

Работа с Entities в Drupal 8 унифицирована и все 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();

Подробно об редактирование полей сущностей мы рассматривали в прошлой статье:

12.11.1. Обращение к полям в Entity.

Удаление нод (сущностей) программно

Если вы хотите удалить одну ноду, то это можно сделать с помощью метода delete():

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

Загрузка множества нод программно

Когда нужно загрузить много нод, то делать это по одной ноде будет затратно, потому что каждая нода имеет поля и для загрузки данных из БД, нужно будет выполнить много 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);

 

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.