Ein EntityFieldQuery
kann sich nur auf einen Entitätstyp beziehen, es kann keine Beziehung zwischen Entitäten darstellen. Wenn das entity_type
in Ihrer Abfrage ein field_collection_item
ist, ist dies der Entitätstyp, den die Abfrage zurückgibt. Das EntityFieldQuery
hat 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
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.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 .
quelle