Wie extrahiere ich Werte der Feldsammlung mit Entityfieldquery?


7

Ich habe einen Inhaltstyp 'Kunde' erstellt, in dem ich eine Feldsammlung mit dem Namen 'Feldgruppe' habe. Die Feldsammlung enthält 2 Felder, nämlich:

  1. Titel
  2. Name

Der Kundeninhaltstyp und die Gruppenfeldsammlung haben den Entitätstyp 'Knoten' und die beiden Felder in der Gruppe haben den Entitätstyp 'Feldsammlungselement'. Ich möchte die Datenbank abfragen, um die Werte der Felder in der Gruppe für diesen bestimmten Inhaltstyp abzurufen. Ich habe die folgende Abfrage verwendet, um die Feldwerte der Gruppe zu erhalten.

    $query = new EntityFieldQuery();

    $query->entityCondition('entity_type', 'field_collection_item')
          ->entityCondition('bundle', 'field_group');

    $result = $query->execute();

$nodes = entity_load('field_collection_item', array_keys($result['field_collection_item'])); 

Die obige Entityfield-Abfrage ruft jedoch alle Werte des Entity-Typs field_collection_item ab. Ich möchte aber nur die Werte des Inhaltstyps "Kunden". Kann mir jemand sagen, was mit der obigen Abfrage falsch ist?

Antworten:


11

Ein EntityFieldQuerykann sich nur auf einen Entitätstyp beziehen, es kann keine Beziehung zwischen Entitäten darstellen. Wenn das entity_typein Ihrer Abfrage ein field_collection_itemist, ist dies der Entitätstyp, den die Abfrage zurückgibt. Das EntityFieldQueryhat keine Vorstellung davon, dass Ihre Feldsammlungen mit Knoten oder irgendetwas anderem in Verbindung stehen.

Um die Entitäten zu erhalten, die sich auf die Feldsammlungen beziehen, müssen Sie eine andere ausführen EntityFieldQuery. Ich habe noch keine Feldsammlung verwendet, aber ich würde vermuten, dass die Logik ungefähr so ​​aussehen würde:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'customer')
  ->fieldCondition('field_name_of_collection_field', 'name_of_field_collection_column', array_keys($result['field_collection_item']));

Es gibt Dinge, die in diesem Code geändert werden müssen (der Name Ihres Feldsammlungsfelds, der Spaltenname für die Feldsammlungsbeziehung), aber es sollte Ihnen den Einstieg erleichtern.

Tatsächliches Beispiel für den Zwei-Abfragen-Ansatz:

function get_species_country($id_country) {
    $inner = new EntityFieldQuery();
    $inner_r = $inner->entityCondition('entity_type', 'field_collection_item')
                     ->fieldCondition('field_species_country', 'target_id', $id_country, '=')
                     ->execute();
    if(!empty($inner_r['field_collection_item'])) {
        $keys = array_keys($inner_r['field_collection_item']);
        $query = new EntityFieldQuery();
        $species_r = $query->entityCondition('entity_type', 'node')
                      ->entityCondition('bundle', self::$bundle)
                      ->fieldCondition('field_species_countries', 'value', $keys)
                      ->execute();
        if(!empty($species_r['node'])) {
            $ret = node_load_multiple(array_keys($species_r['node']));
        }
    }
    return $ret;
}

Im obigen Beispiel:

  • field_species_countries - Name der Feldsammlung
  • field_species_country - Tatsächliches Feld innerhalb der Feldsammlung

Einschränkungen : Ich denke, dies hat einige Einschränkungen, da die zweite Abfrage ... WHERE- Feld IN (1, 2, 3 ...) enthält. Für MySQL ist dies durch max_allowed_packet begrenzt


Ich werde das ausprobieren und dich wissen lassen. Prost Kumpel.
Drupal Entwickler

1
Das war sehr hilfreich, danke! Ich habe ein wenig gebraucht, um meinen Kopf herumzureißen. Daher ist es EntityFieldQuery möglicherweise erwähnenswert, dass Sie eine Sekunde ausführen müssen , die die EntityIds der relevanten Feldsammlungselemente zurückgibt, die dann in die fieldCondition-Methode der Hauptabfrage eingefügt werden.
Aendrew

0

Ich denke, Sie möchten den Parameter delta_group verwenden, um EFQ wissen zu lassen, dass die Felder in Beziehung stehen sollen. In diesem Kommentar zur Dokumentation zu fieldCondition finden Sie eine gute Erklärung .

Mit dem Parameter $ delta_group können Sie Bedingungen zusammenfassen. Ich habe die Dokumente immer gelesen, um zu bedeuten, dass wir das Delta innerhalb des Feldes selbst angegeben haben, aber dies ist nicht der Fall.

Wenn Sie beispielsweise Entitäten basierend auf zwei Spalten aus demselben Feld auswählen möchten, verwenden Sie eine Delta-Gruppe, um sicherzustellen, dass die Bedingungen abhängig sind.


Ich hasse es, ein Downvoter zu sein, aber soweit ich das beurteilen kann, stimmt das nicht - wie Clive sagte, hat EntityFieldQuery kein Konzept, dass die beiden Bundles verwandt sind. Sie fungieren im Wesentlichen als zwei separate Entitätstypen. Das heißt, wenn Sie mit delta_groups einen Proof-of-Concept durchführen können, werde ich die Abstimmung gerne ablehnen.
Aendrew

aendrew, verstehe ich falsch, was in diesem Codebeispiel vor sich geht, oder verstehe ich die Frage falsch? drupal.org/node/916776#comment-4011564
Beth

Ich denke, die Frage - die Delta-Gruppe verknüpft nur die Bedingungen (ähnlich wie das Hinzufügen von Klammern in einer if-Anweisung). Die Frage besteht im Wesentlichen darin, einen Entitätstyp abzufragen und die Ergebnisse davon als Bedingung in einer zweiten Abfrage zu verwenden. Bei dem fraglichen Feld handelt es sich um eine Feldsammlung , bei der es sich um einen separaten Entitätstyp mit eigenen eindeutigen Feldern handelt. (Es ist schwer zu erklären, ob Sie noch nie Feldsammlungen verwendet haben. Es ist jedoch ein ziemlich cooles Modul und es lohnt sich, es zu überprüfen, wenn nicht ).
aendrew
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.