Ruft Felder aus einer von EntityFieldQuery zurückgegebenen Entität ab

7

Ich habe einen Videoinhaltstyp. Ich führe die folgende Abfrage in aus hook_cron:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->entityCondition('bundle', 'video');
$query->propertyCondition('status', 1);
$results = $query->execute();

Diese gibt die Anzahl von Entitätsobjekt mit Eigentum nid, vidund type. Ich möchte dieses Objekt verwenden, um einen Wert für ein bestimmtes Feld des Videos zu finden (z. B. Dauer). Ich möchte nicht verwenden node_load, weil ich das an erster Stelle getan hätte, anstatt die Abfrage zu verwenden. Wie kann das gemacht werden?

AjitS
quelle

Antworten:

5

Das EntityFieldQuery Extra Fields- Modul könnte Ihr Problem lösen.

Die Abfrage gibt, wie unten gezeigt, ein Objekt zurück, das die Entitäts-ID, den Entitätstyp und ein Objekt enthält, das den Entitätstyp, die Entitäts-ID, die Revisions-ID, das Bundle und das angeforderte Feld enthält. Ihr Code wäre:

$query = new EntityFieldQueryExtraFields();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'video')
  ->addExtraField('field_duration', 'value', 'value')
  ->propertyCondition('status', 1);

$results = $query->execute();

Ich verwende diese Lösung derzeit auf einer Website.

SpartyDan
quelle
11

Es kann nicht - es EntityFieldQuerywird immer nur die Entitäts-ID und die Bundle-Schlüssel geladen.

Sie haben keine andere Wahl, als zu verwenden node_load_multiple()(oder das Äquivalent, wenn Sie einen anderen Entitätstyp verwenden).

$nodes = node_load_multiple(array_keys($results['node']));

Beachten Sie, dass der $conditionsParameter von node_load_multiple()veraltet ist. zugunsten dessen, EntityFieldQuerywie ich es verstehe.

Sie können EntityFieldQuerydie execute()Methode theoretisch unterordnen und überschreiben , um die vollständig geladenen Entitäten zurückzugeben. Sie müssen die Klasse jedoch auch erweitern, damit sie immer weiß, nach welchem ​​Entitätstyp sie abfragt. Andernfalls weiß es nicht, in welchem ​​Schlüssel es verwendet werden soll $results.

Clive
quelle
Vielen Dank. Nur ein kleiner Zweifel. Ich habe nicht , wenn Sie „Unterklasse sagen EntityFieldQuery- aber Sie werden auch die Klasse erweitern müssen“. Ist das Erstellen einer Unterklasse nicht gleichbedeutend mit dem Erweitern einer Unterklasse? Oder beziehen Sie sich auf etwas anderes, das ich nicht verstehe?
AjitS
Entschuldigung, schlechte Wortwahl. Ich wollte nur, dass Sie Ihre Unterklasse so ausrüsten müssen, dass sie ein Entitätstyp-Argument bedingungslos akzeptiert, da die Entitätsobjekte geladen werden müssen
Clive