it-swarm.com.de

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

So fragen Sie alle Werte eines bestimmten Feldes ab. Ich benutzte Drupal\Core\Database\Connection object, um die folgenden Werte abzurufen:

$connection = \Drupal::database();
$result = $connection->select('node__body', 'n')
  ->fields('n', array('body_value'))
  ->execute()->fetchCol();

Gibt es eine Drupal 8 API speziell dafür? Ich muss alle Werte des Feldes abrufen und die Feldwerte für ein bestimmtes Knotenpaket abrufen.

2
Pravin Ajaaz

In Drupal 7) würden Sie die Klasse EntityFieldQuery verwenden. In Drupal 8 gibt es einen äquivalenten Dienst .

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

$nids = $query->execute();

In Ihrem Fall benötigen Sie anstelle von field_tag.entity.name body.body_value. Siehe EntityFieldQuery wurde neu geschrieben .
Wenn Sie nur alle Knoten-IDs abrufen müssen, entfernen Sie alle Zeilen condition() und laden Sie dann mit entity_load_multiple('node', $nids) die vollständigen Knotenobjekte.

Auf diese Weise macht Ihr Code keine Annahmen über die Tabellen, in denen die Knotendaten enthalten sind. Außerdem kann es leicht erweitert werden, um die Knoten anhand einiger Kriterien (Knoteneigenschaften, Inhalt von Feldern ...) zu filtern.

7
kiamlaluno

Obwohl entityQuery sehr mächtig ist, glaube ich, dass nicht alles damit gemacht werden kann und sollte. Das Laden aller Knoten, um die Werte zu erhalten, verbraucht möglicherweise zu viel Ressourcen. Die Verwendung von Datenbank-API sollte mit Hilfe von TableMappingInterface in Ordnung sein, wie in der Dokumentation angegeben:

Bietet eine gemeinsame Schnittstelle zum Zuordnen von Feldspalten zu SQL-Tabellen.

Warnung: Die Verwendung der hier bereitgestellten Methoden sollte nur beim Schreiben von Code erfolgen, der explizit auf einen SQL-basierten Entitätsspeicher abzielt. In der Regel wird diese API von SQL-Speicherklassen oder anderem SQL-spezifischen Code wie dem Views-Integrationscode für den Entity SQL-Speicher verwendet. Ein weiteres Beispiel für die legale Verwendung dieser API ist das Schreiben einer Abfrage, die\Drupal :: entityQuery () nicht unterstützt.

/** @var \Drupal\Core\Entity\Sql\TableMappingInterface $table_mapping*/
$table_mapping = \Drupal::entityTypeManager()->getStorage('node')->getTableMapping();

$field_table = $table_mapping->getFieldTableName('field_categories');
$field_storage_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions('node')['field_categories'];
$field_column = $table_mapping->getFieldColumnName($field_storage_definitions, 'target_id');

$connection = \Drupal::database();
$result = $connection->select($field_table, 'f')
  ->fields('f', array($field_column))
  ->distinct(TRUE)
  ->condition('bundle', 'article')
  ->condition('entity_id', $nids, 'IN')
  ->execute()->fetchCol();

Das funktioniert soweit. Es gibt jedoch noch Annahmen zu den Spalten bundle und entity_id. Ich bin mir nicht sicher, ob es sicher wäre anzunehmen, dass sie immer da sein werden. Vielleicht gibt es auch Funktionen, um das Bundle und die Entity-ID-Spalte abzurufen, aber ich denke nicht, da es den Anschein hat, dass Ansichten dieselben Annahmen treffen, siehe views_field_default_views_data .

2
LarS