Como carregar um nó por um valor de campo?

19

Eu quero carregar um determinado nó. Não sei o ID do nó, mas sei que ele tem um determinado campo de hash que é único e sei esse hash.

Eu quero carregar o nó através do campo hash. Como eu posso fazer isso?

Andrew
fonte

Respostas:

14

Você pode conseguir usando EntityFieldQuery.

Para o D8, o EntityFieldQuery foi reescrito.

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

Como obtenho os valores do campo de uma entidade?

$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
fonte
Portanto, se estou entendendo isso corretamente, isso retornará vários IDs de nó (ou um, ou nenhum, dependendo da condição), mas ainda preciso usar Node::para carregar esses nós, correto?
Andrew
sim você está certo.
DRUPWAY 14/02
31

A maneira mais rápida para carregar um nó específico pelo valor do campo é usar o método loadByProperties().

Você especifica um ou mais valores de campo e retorna uma matriz que contém os nós que correspondem aos valores de campo:

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

Normalmente você faz um loop sobre os nós. No seu caso, você está procurando um nó específico. Um único nó também é retornado na matriz, portanto, aplique reset()e isso retornará o nó ou NULL se nada for encontrado:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
fonte
1
Suponho que, no meu caso, não precisaria da segunda parte do código ( $node = reset...), pois o hash em si é único.
Andrew
3
O nó único ainda está em uma matriz. Você pode usar $ node = $ nodes [0], mas precisará verificar se existe um nó para evitar avisos no log de erros. reset () é melhor porque retorna silenciosamente NULL.
4k4
Não sei por que todos os votos positivos para isso; a pergunta original é carregar um nó pelo valor do campo. Uma propriedade (como Título) não é um campo.
liquidcms 30/11
@liquidcms, title é um campo do nó e você pode usar qualquer outro campo do nó. Os campos do BTW Drupal têm uma ou mais propriedades. Se for uma propriedade, o Drupal usa na maioria das vezes o valor do nome da propriedade. Portanto, para a maioria dos campos, os dois termos são intercambiáveis.
4k4 30/11
Veja este exemplo para consultar dois campos diferentes drupal.stackexchange.com/questions/250306/…
4k4 30/11