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ć?

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

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
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.