滚动
9.11.2. 以编程方式添加、更新和删除实体
在 Drupal 中,所有实体的工作方式是统一的,所有 CRUD 操作(创建、读取、更新、删除)对所有实体也都是相同的。本文将介绍如何在自定义代码中操作实体。
我们先来看一些简单的示例。
以编程方式创建节点(Create node programmatically)
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()
方法保存实体。
以编程方式更新节点(Update node programmatically)
$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
以编程方式删除节点(Delete node programmatically)
如果你想删除单个节点,可以使用 delete()
方法:
$nid = 123;
$node = node_load($nid);
$node->delete();
以编程方式创建多个节点(Create multiple nodes programmatically)
当你需要加载多个节点时,一个一个加载的方式性能很差,因为每个节点都有自己的字段,加载每个节点都需要执行多条 SQL 查询。更高效的方式是一次性加载所有节点:
$nids = db_select('node_field_data', 'n')
->fields('n', ['nid'])
->condition('title', $my_title)
// node_access 标签会检查访问权限。
->addTag('node_access')
->execute()
->fetchCol();
$nodes = Node::loadMultiple($nids);
以编程方式删除多个节点(Delete multiple nodes programmatically)
$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);