Comment charger un nœud par une valeur de champ?

19

Je veux charger un certain nœud. Je ne connais pas l'id du nœud mais je sais qu'il a un certain champ de hachage qui est unique et je connais ce hachage.

Je veux charger le nœud via le champ de hachage. Comment puis je faire ça?

Andrew
la source

Réponses:

14

Vous pouvez y parvenir en utilisant EntityFieldQuery.

Pour D8 EntityFieldQuery a été réécrit.

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

Comment récupérer les valeurs du champ d'une 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();
DRUPWAY
la source
Donc, si je comprends bien, cela renverra un tas d'identifiants de nœuds (ou un, ou aucun, selon la condition), mais je dois encore utiliser Node::pour charger lesdits nœuds, n'est-ce pas?
Andrew
Oui, tu as raison.
DRUPWAY
31

La façon la plus rapide de charger un nœud spécifique par valeur de champ consiste à utiliser la méthode loadByProperties().

Vous spécifiez une ou plusieurs valeurs de champ et renvoyé est un tableau contenant les nœuds correspondant aux valeurs de champ:

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

Normalement, vous bouclez sur les nœuds. Dans votre cas, vous recherchez un nœud spécifique. Un seul nœud est également renvoyé dans le tableau, alors appliquez reset()et cela renvoie le nœud ou NULL si rien n'a été trouvé:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
la source
1
Je suppose que dans mon cas, je n'aurais pas besoin de la deuxième partie du code ( $node = reset...) car le hachage lui-même est unique.
Andrew
3
Le nœud unique est toujours dans un tableau. Vous pouvez utiliser $ node = $ nodes [0], mais vous devrez alors vérifier s'il existe un nœud pour éviter les avertissements dans le journal des erreurs. reset () est meilleur car il retourne silencieusement NULL.
4k4
Je ne sais pas pourquoi tous les votes positifs pour cela; la question d'origine est de charger un nœud par valeur de champ. Une propriété (comme le titre) n'est pas un champ.
liquidcms
@liquidcms, title est un champ de nœud et vous pouvez utiliser n'importe quel autre champ de nœud. Les champs BTW Drupal ont une ou plusieurs propriétés. S'il s'agit d'une propriété, Drupal utilise la plupart du temps la valeur du nom de la propriété. Ainsi, pour la plupart des domaines, les deux termes sont interchangeables.
4k4
Voir cet exemple pour interroger deux champs différents drupal.stackexchange.com/questions/250306/…
4k4