Работа с 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);
Добавить комментарий