Wie lade ich einen Knoten mit einem Feldwert?

19

Ich möchte einen bestimmten Knoten laden. Ich kenne die ID des Knotens nicht, aber ich weiß, dass er ein bestimmtes Hash-Feld hat, das eindeutig ist, und ich kenne diesen Hash.

Ich möchte den Knoten über das Hash-Feld laden. Wie kann ich das machen?

Andrew
quelle

Antworten:

14

Sie können mit EntityFieldQuery erreichen.

Für D8 wurde EntityFieldQuery umgeschrieben.

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

Wie rufe ich die Werte des Felds einer Entität ab?

$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
quelle
Wenn ich das richtig verstehe, gibt dies eine Reihe von Knoten-IDs zurück (oder eine oder keine, abhängig von der Bedingung), aber ich muss sie trotzdem Node::zum Laden der Knoten verwenden, richtig?
Andrew
ja, du hast recht.
DRUPWAY
31

Die schnellste Methode zum Laden eines bestimmten Knotens nach Feldwert ist die Verwendung der Methode loadByProperties().

Sie geben einen oder mehrere Feldwerte an und geben ein Array zurück, das die Knoten enthält, die mit den Feldwerten übereinstimmen:

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

Normalerweise schleifen Sie über die Knoten. In Ihrem Fall suchen Sie einen bestimmten Knoten. Ein einzelner Knoten wird auch im Array zurückgegeben, also gilt reset()und dies gibt entweder den Knoten oder NULL zurück, wenn nichts gefunden wurde:

if ($node = reset($nodes)) {
  // found $node that matches the title
}
4k4
quelle
1
Ich gehe davon aus, dass ich in meinem Fall den zweiten Teil des Codes ( $node = reset...) nicht benötigen würde, da der Hash selbst eindeutig ist.
Andrew
3
Der einzelne Knoten befindet sich noch in einem Array. Sie könnten $ node = $ nodes [0] verwenden, aber dann müssten Sie prüfen, ob es einen Knoten gibt, um Warnungen im Fehlerprotokoll zu vermeiden. reset () ist besser, weil es im Hintergrund NULL zurückgibt.
4. April,
Ich weiß nicht, warum das so ist. Die ursprüngliche Frage ist, einen Knoten nach Feldwert zu laden. Eine Eigenschaft (wie Title) ist kein Feld.
Liquidcms
@liquidcms, title ist ein Knotenfeld und Sie können jedes andere Knotenfeld verwenden. BTW Drupal-Felder haben eine oder mehrere Eigenschaften. Wenn es sich um eine Eigenschaft handelt, verwendet Drupal meistens den Wert des Eigenschaftsnamens. Daher sind beide Begriffe für die meisten Felder austauschbar.
4. 4.,
In diesem Beispiel werden zwei verschiedene Felder abgefragt. Drupal.stackexchange.com/questions/250306/…
4k4