Jak załadować węzeł według wartości pola?

19

Chcę załadować określony węzeł. Nie znam identyfikatora węzła, ale wiem, że ma on pewne pole skrótu, które jest unikalne i znam ten skrót.

Chcę załadować węzeł za pomocą pola skrótu. Jak mogę to zrobić?

Andrzej
źródło

Odpowiedzi:

14

Możesz to osiągnąć za pomocą EntityFieldQuery.

Dla D8 EntityFieldQuery został przepisany.

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

Jak pobrać wartości pola encji?

$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
źródło
Więc jeśli rozumiem to poprawnie, zwróci to wiązkę identyfikatorów węzłów (lub jeden lub żaden, zależnie od warunków), ale nadal muszę użyć Node::do załadowania wspomnianych węzłów, prawda?
Andrew
tak masz rację.
DRUPWAY
31

Najszybszym sposobem na załadowanie określonego węzła według wartości pola jest użycie metody loadByProperties().

Podajesz jedną lub więcej wartości pól, a zwracana jest tablica zawierająca węzły pasujące do wartości pól:

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

Zwykle zapętlasz węzły. W twoim przypadku szukasz jednego konkretnego węzła. Pojedynczy węzeł jest również zwracany w tablicy, więc zastosuj, reset()a to zwróci węzeł lub NULL, jeśli nic nie zostanie znalezione:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
źródło
1
Zakładam, że w moim przypadku nie potrzebowałbym drugiej części kodu ( $node = reset...), ponieważ sam skrót jest unikalny.
Andrew
3
Pojedynczy węzeł nadal znajduje się w tablicy. Możesz użyć $ node = $ nodes [0], ale wtedy musisz sprawdzić, czy istnieje węzeł, aby uniknąć ostrzeżeń w dzienniku błędów. Reset () jest lepszy, ponieważ po cichu zwraca NULL.
4k4
Nie jestem pewien, dlaczego wszystkie przychylne głosy za to; pierwotnym pytaniem jest załadowanie węzła według wartości pola. Właściwość (jak Tytuł) nie jest polem.
liquidcms
@liquidcms, title to pole węzła i możesz użyć dowolnego innego pola węzła. Pola BTW Drupal mają jedną lub więcej właściwości. Jeśli jest to jedna właściwość, Drupal używa najczęściej wartości nazwy właściwości. Tak więc dla większości pól oba terminy są wymienne.
4k4
Zobacz ten przykład dla zapytania o dwa różne pola drupal.stackexchange.com/questions/250306/…
4k4