📜  drupal 8 实体查询 - PHP (1)

📅  最后修改于: 2023-12-03 15:00:32.689000             🧑  作者: Mango

Drupal 8 实体查询 - PHP

在 Drupal 8 中,实体查询是一个非常强大的功能。它可以让你查询和过滤实体,以便在你的主题或模块中展示数据。在本文中,我们将讨论如何在 PHP 中使用实体查询。

为什么要使用实体查询?

在 Drupal 8 中,实体是存储在数据库中的核心数据对象。例如,一个节点或用户就是一个实体。实体查询可以让你方便地查询和操作这些数据。

在使用实体查询时,你可以:

  • 筛选要返回的实体
  • 对实体进行排序
  • 限制返回的实体数量
  • 排除某些实体
  • 根据实体关系查询数据
如何使用实体查询?

在 PHP 中,使用实体查询需要创建一个实体查询对象。下面是一个简单的例子:

$node_query = \Drupal::entityQuery('node');

在这个例子中,我们创建了一个对节点进行查询的对象。现在我们可以使用 $node_query 对象进行查询和过滤。

添加筛选条件

要添加筛选条件,可以使用 $node_query 对象的 condition() 方法。例如,要筛选出所有标题包含特定关键字的节点,可以这样写:

$node_query->condition('title', '关键字', 'CONTAINS');

在这个例子中,我们使用了 condition() 方法,传入“标题”字段、关键字和一个操作符“CONTAINS”。

添加排序

要对查询的结果进行排序,可以使用 $node_query 对象的 sort() 方法。例如,要按发表时间从新到旧排序,可以这样写:

$node_query->sort('created', 'DESC');

在这个例子中,我们使用了 sort() 方法,传入“创建时间”字段和一个排序方向“DESC”。

限制返回的结果数量

要限制返回的结果数量,可以使用 $node_query 对象的 range() 方法。例如,要返回前50个结果,可以这样写:

$node_query->range(0, 50);

在这个例子中,我们使用了 range() 方法,传入从第0个结果开始返回和要返回的结果数量50个。

排除某些实体

要排除某些实体,可以使用 $node_query 对象的 conditionNot() 方法。例如,要排除特定 ID 的节点,可以这样写:

$node_query->conditionNot('nid', [1, 2, 3]);

在这个例子中,我们使用了 conditionNot() 方法,传入要排除的“节点 ID”字段和要排除的 ID 数组。

根据实体关系查询数据

要查询与某个实体相关联的其他实体,可以使用 $node_query 对象的 relationship() 方法。例如,要查询一个节点相关的评论,可以这样写:

$node_query->condition('type', 'article')
  ->relationship('comment', 'commented_entity')
  ->condition('comment.status', 1);

在这个例子中,我们使用了 relationship() 方法和 condition() 方法,传入评论关联到的字段“commented_entity”和每个评论的状态“status”。

执行查询

要执行查询并获得结果,可以使用 $node_query 对象的 execute() 方法。例如,要查询所有标题包含特定关键字的节点并获取结果,可以这样写:

$nids = $node_query->condition('title', '关键字', 'CONTAINS')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

在这个例子中,我们使用了 execute() 方法和 getStorage() 方法,获取查询到的节点 ID,然后使用 loadMultiple() 方法获取节点对象并存储在 $nodes 变量中。

总结

在本文中,我们介绍了如何在 PHP 中使用 Drupal 8 实体查询。我们讨论了如何添加筛选条件、排序、限制结果和排除某些实体。我们还了解了如何根据实体关系查询数据并执行查询。希望这篇文章能够帮助你更好地了解和使用实体查询。