Як завантажити вузол за значенням поля?


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

Отже, якщо я правильно це розумію, це поверне купу ідентифікаторів вузлів (або один, або жоден, залежно від умови), але мені все одно доведеться використовувати Node::для завантаження вказаних вузлів, правильно?
Андрій

так, ти правий.
DRUPWAY

31

Найшвидший спосіб завантажити певний вузол за значенням поля - це використовувати метод loadByProperties().

Ви вказуєте одне або більше значень поля, а повертається - це масив, що містить вузли, що відповідають значенням поля:

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

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

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

1
Я припускаю, що в моєму випадку мені не знадобиться друга частина коду ( $node = reset...), оскільки сам хеш унікальний.
Андрій

3
Єдиний вузол все ще знаходиться в масиві. Ви можете використовувати $ node = $ nodes [0], але тоді вам доведеться перевірити, чи є вузол, щоб уникнути попереджень у журналі помилок. reset () краще, тому що він мовчки повертає NULL.
4k4

Не впевнений, чому всі нагороди за це; оригінальне питання полягає у завантаженні вузла за значенням поля. Властивість (як-от Назва) не є полем.
liquidcms

@liquidcms, title - це поле вузла, і ви можете використовувати будь-яке інше поле вузла. Поля BTW Drupal мають одне або більше властивостей. Якщо це одна властивість, Drupal використовує більшість разів значення імені властивості. Тож для більшості полів обидва терміни є взаємозамінними.
4k4

Дивіться цей приклад для запиту двох різних полів drupal.stackexchange.com/questions/250306/…
4k4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.