web-dev-qa-db-fra.com

Extraire des champs d'une entité renvoyée par EntityFieldQuery

J'ai un type de contenu vidéo. J'exécute la requête suivante dans hook_cron:

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

Cela renvoie le nombre d'objet entité avec la propriété nid, vid et type. Je veux utiliser cet objet pour trouver une valeur d'un champ particulier de la vidéo (disons la durée). Je ne veux pas utiliser node_load, car je l'aurais fait en premier lieu au lieu d'utiliser la requête. Comment cela peut-il être fait?

7
AjitS

Le module EntityFieldQuery Extra Fields pourrait résoudre votre problème.

La requête, comme illustré ci-dessous, renverra un objet qui contient l'ID d'entité, le type d'entité et un objet qui contient entity_type, entity_id, revision_id, bundle et le champ demandé. Votre code serait:

$query = new EntityFieldQueryExtraFields();

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

$results = $query->execute();

J'utilise actuellement cette solution sur un site.

5
SpartyDan

Il ne peut pas - un EntityFieldQuery ne chargera que l'ID d'entité et les clés de l'ensemble.

Il n'y a pas d'autre choix que d'utiliser node_load_multiple() (ou l'équivalent si vous utilisez un type d'entité différent).

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

Gardez à l'esprit que le paramètre $conditions De node_load_multiple() est déconseillé; en faveur de EntityFieldQuery si je comprends bien.

Vous pouvez théoriquement sous-classer EntityFieldQuery et remplacer la méthode execute() pour renvoyer les entités entièrement chargées - mais vous devrez également étendre la classe afin qu'elle sache toujours quel type d'entité elle recherche; sinon, il ne saura pas quelle clé utiliser dans $results.

11
Clive