logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
16/10/2025, by Ivan

在 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);