¿Cómo cargar un nodo por un valor de campo?

19

Quiero cargar un determinado nodo. No sé la identificación del nodo, pero sí sé que tiene un cierto campo hash que es único y sé que ese hash.

Quiero cargar el nodo a través del campo hash. ¿Cómo puedo hacer eso?

Andrés
fuente

Respuestas:

14

Puede lograrlo usando EntityFieldQuery.

Para D8, EntityFieldQuery ha sido 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();

¿Cómo obtengo los valores del campo de una entidad?

$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
fuente
Entonces, si estoy entendiendo esto correctamente, esto devolverá un montón de identificadores de nodo (o uno, o ninguno, dependiendo de la condición), pero todavía tengo que usar Node::para cargar dichos nodos, ¿correcto?
Andrew
Sí, tiene usted razón.
DRUPWAY
31

La forma más rápida de cargar un nodo específico por valor de campo es usar el método loadByProperties().

Usted especifica uno o más valores de campo y se devuelve una matriz que contiene los nodos que coinciden con los valores de campo:

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

Normalmente, recorre los nodos. En su caso, está buscando un nodo específico. También se devuelve un solo nodo en la matriz, por lo que se aplica reset()y esto devuelve el nodo o NULL si no se encontró nada:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
fuente
1
Asumo en mi caso que no necesitaría la segunda parte del código ( $node = reset...) ya que el hash en sí es único.
Andrew
3
El nodo único todavía está en una matriz. Podría usar $ node = $ node [0], pero luego tendría que verificar si hay un nodo para evitar advertencias en el registro de errores. reset () es mejor porque silenciosamente devuelve NULL.
4k4
No estoy seguro de por qué todos los votos a favor de esto; La pregunta original es cargar un nodo por valor de campo. Una propiedad (como Título) no es un campo.
liquidcms
@liquidcms, title es un campo de nodo y puede usar cualquier otro campo de nodo. Por cierto, los campos de Drupal tienen una o más propiedades. Si es una propiedad, Drupal usa la mayoría de las veces el valor del nombre de la propiedad. Entonces, para la mayoría de los campos, ambos términos son intercambiables.
4k4
Consulte este ejemplo para consultar dos campos diferentes drupal.stackexchange.com/questions/250306/…
4k4