Как загрузить узел по значению поля?

19

Я хочу загрузить определенный узел. Я не знаю идентификатор узла, но знаю, что у него есть определенное уникальное хеш-поле, и я знаю этот хеш.

Я хочу загрузить узел через поле хеша. Как я могу это сделать?

Андрей
источник

Ответы:

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();
DRUPWAY
источник
Так что, если я правильно понимаю, это вернет кучу идентификаторов узлов (или один, или ни одного, в зависимости от условия), но я все еще должен использовать Node::для загрузки указанных узлов, правильно?
Андрей
да ты прав.
DRUPWAY
31

Самый быстрый способ загрузить определенный узел по значению поля - использовать метод loadByProperties().

Вы указываете одно или несколько значений поля и возвращаете массив, содержащий узлы, соответствующие значениям поля:

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

Обычно вы перебираете узлы. В вашем случае вы ищете один конкретный узел. Отдельный узел также возвращается в массиве, поэтому применяется, reset()и это возвращает либо узел, либо NULL, если ничего не было найдено:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
источник
1
Я предполагаю, что в моем случае мне не понадобится вторая часть кода ( $node = reset...), поскольку сам хеш уникален.
Андрей
3
Единственный узел все еще находится в массиве. Вы можете использовать $ node = $ node [0], но тогда вам придется проверить, существует ли узел, чтобы избежать предупреждений в журнале ошибок. reset () лучше, потому что он молча возвращает NULL.
4k4
Не уверен, почему все противники за это; Первоначальный вопрос - загрузить узел по значению поля. Свойство (например, Заголовок) не является полем.
liquidcms
@liquidcms, title - это поле узла, и вы можете использовать любое другое поле узла. Кстати, поля Drupal имеют одно или несколько свойств. Если это одно свойство, Drupal чаще всего использует значение имени свойства. Таким образом, для большинства полей оба термина являются взаимозаменяемыми.
4k4
Посмотрите этот пример для запроса двух разных полей. Drupal.stackexchange.com/questions/250306/…
4k4