Come caricare un nodo in base a un valore di campo?


19

Voglio caricare un certo nodo. Non conosco l'id del nodo ma so che ha un certo campo hash che è unico e conosco quell'hash.

Voglio caricare il nodo tramite il campo hash. Come posso fare ciò?

Risposte:


14

È possibile ottenere utilizzando EntityFieldQuery.

Per D8 EntityFieldQuery è stato riscritto.

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

Come posso recuperare i valori del campo di un'entità?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('changed', REQUEST_TIME, '<')
    ->condition('title', 'cat', 'CONTAINS')
    ->condition('field_tags.entity.name', 'cats');

$nids = $query->execute();

Quindi, se lo capisco correttamente, questo restituirà un sacco di ID nodo (o uno, o nessuno, a seconda della condizione), ma devo ancora usare Node::per caricare detti nodi, giusto?
Andrew,

si hai ragione.
DRUPWAY,

31

Il modo più rapido per caricare un nodo specifico in base al valore del campo è utilizzare il metodo loadByProperties().

Specificare uno o più valori di campo e restituito è un array contenente i nodi corrispondenti ai valori di campo:

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

Normalmente si passa sopra i nodi. Nel tuo caso stai cercando un nodo specifico. Viene restituito anche un singolo nodo nella matrice, quindi applica reset()e questo restituisce il nodo o NULL se non è stato trovato nulla:

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

1
Presumo che nel mio caso non avrei bisogno della seconda parte del codice ( $node = reset...) poiché l'hash stesso è unico.
Andrew,

3
Il singolo nodo è ancora in un array. È possibile utilizzare $ node = $ nodes [0], ma è necessario verificare se esiste un nodo per evitare avvisi nel registro errori. reset () è migliore perché restituisce NULL in silenzio.
4k4,

Non sono sicuro del motivo per cui tutti i voti per questo; la domanda originale è caricare un nodo per valore di campo. Una proprietà (come il titolo) non è un campo.
liquidcms

@liquidcms, il titolo è un campo nodo e puoi usare qualsiasi altro campo nodo. I campi Drupal BTW hanno una o più proprietà. Se si tratta di una proprietà, Drupal utilizza il più delle volte il valore del nome della proprietà. Quindi per la maggior parte dei campi entrambi i termini sono intercambiabili.
4k4

Vedi questo esempio per l'interrogazione di due diversi campi drupal.stackexchange.com/questions/250306/…
4k4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.