如何通过字段值加载节点?


19

我想加载某个节点。我不知道节点的ID,但我确实知道它具有特定的哈希字段,并且我知道该哈希。

我想通过哈希字段加载节点。我怎样才能做到这一点?

Answers:


14

您可以使用EntityFieldQuery来实现。

对于D8,EntityFieldQuery已被重写。

Drupal 8:

$query = \Drupal::entityQuery('entity_test');
$default_langcode_group = $query->andConditionGroup()
  ->condition('user_id', $properties[$default_langcode]['user_id'], '=', $default_langcode)
  ->condition('name', $properties[$default_langcode]['name'], '=', $default_langcode);
$langcode_group = $query->andConditionGroup()
  ->condition('name', $properties[$langcode]['name'], '=', $langcode)
  ->condition("$this->field_name.value", $field_value, '=', $langcode);
$result = $query
  ->condition('langcode', $default_langcode)
  ->condition($default_langcode_group)
  ->condition($langcode_group)
  ->sort('name', 'ASC', $default_langcode)
  ->execute();

如何获取实体字段的值?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('changed', REQUEST_TIME, '<')
    ->condition('title', 'cat', 'CONTAINS')
    ->condition('field_tags.entity.name', 'cats');

$nids = $query->execute();

因此,如果我正确理解了这一点,它将返回一堆节点ID(根据情况返回一个ID,或者一个,也可以不返回),但是我仍然必须使用它Node::来加载所述节点,对吗?
安德鲁

你是对的。
DRUPWAY

31

通过字段值加载特定节点的最快方法是使用方法loadByProperties()

您指定一个或多个字段值,然后返回一个数组,其中包含与字段值匹配的节点:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);

通常,您遍历节点。在您的情况下,您正在寻找一个特定的节点。数组中还会返回单个节点,因此套用apply reset(),如果什么也没找到,则返回节点或NULL:

if ($node = reset($nodes)) {
  // found $node that matches the title
}

1
我假设在我的情况下,我不需要代码的第二部分($node = reset...),因为哈希本身是唯一的。
安德鲁

3
单个节点仍在阵列中。您可以使用$ node = $ nodes [0],但随后必须检查是否有节点以避免错误日志中的警告。reset()更好,因为它默默地返回NULL。
4k4

不知道为什么要为此全部投票;最初的问题是按字段值加载节点。属性(如“标题”)不是字段。
liquidcms

@liquidcms,标题是节点字段,您可以使用任何其他节点字段。BTW Drupal字段具有一个或多个属性。如果它是一个属性,则Drupal多数时候会使用属性名称值。因此,对于大多数字段,这两个术语可以互换。
4,19

请参阅查询两个不同的领域这个例子drupal.stackexchange.com/questions/250306/...
4k4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.