web-dev-qa-db-fra.com

Obtenir uniquement certains champs avec EntityFieldQuery?

Drupal 7 possède un système de requêtes de type ORM très prometteur avec EntityFieldQuery.

Actuellement, je comprends comment faire la sélection des nœuds, mais le résultat ne contient aucune information spécifique, comme les fichiers, que je recherche.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

Nous devons donc charger des données entières de nœuds, si nous voulons obtenir uniquement les valeurs d'un champ, par exemple 'field_date' dans l'exemple actuel.

$nodes = entity_load('node', array_keys($entities['node']));

S'il existe un moyen d'obtenir la valeur des champs, chargez plutôt les données complètes de tous les nœuds, car cela provoque une surcharge de mémoire.

$nodesFieldDates = ???
18
Fedir RYKHTIK

Grande question!

EntityFieldQuery est vraiment une bonne chose, mais si vous voulez vraiment devenir sérieux, vous devez remplacer la classe dans un module personnalisé et ajoutez le comportement que vous devez y faire.

Je ne connais pas vos intentions exactes, mais je me suis référé à cet article sur le sujet dans le passé. Remerciements à Neil Hastings pour cet article bien écrit.

Recherchez des exemples de code un peu dans l'article pour de beaux exemples de remplacement.

J'espère que cela aide, codage heureux!

10
stefgosselin

J'ai trouvé la réponse à cela! Le module Apache Solr étend la classe EntityFieldQuery pour y arriver. Il ajoute une nouvelle méthode appelée addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Si vous n'avez pas installé Apache Solr, copiez simplement le code pour étendre cette classe.

11
mikeytown2

Vous n'avez pas besoin de remplacer quoi que ce soit ou d'étendre la classe. Il vous suffit d'utiliser field_attach_load() pour attacher le champ souhaité aux résultats de la classe EntityFieldQuery .

Voir aussi Chargement d'un seul champ à partir d'une entité ou Node in Drupal 7 , un bon article avec des exemples sur la façon de le faire) .

8
jyee

Quiconque souhaite toujours obtenir des champs d'un EFQ jette un œil au module EFQ Extra Fields .

Avertissement: ce module abuse de EntityFieldQuery pour renvoyer des données de votre base de données. Il ne fonctionne pas avec les entités ou les modules qui s'appuient sur eux.

Il vous permet d'utiliser addField dans un objet EntityFieldQueryExtraFields (étend les objets EntityFieldQuery). Initialement, EntityFieldQuery ne vous donne que l'identifiant d'entité, le bundle et le type d'entité. Ce module ajoute une couche supplémentaire en plus de cela sans faire de charge_entité supplémentaire! Important si vous souhaitez travailler avec des quantités massives de données et que vous souhaitez réduire les requêtes SQL. Puisque EFQ interroge déjà la base de données pour ces informations, pourquoi ne pas modifier cette requête pour vous donner également des champs supplémentaires. Cela signifie qu'aucune requête supplémentaire ne sera effectuée pour obtenir ces données.

Un mot d'avertissement, si vous comptez sur un post-formatage/post-chargement qui se produit dans entity_load ou des fonctions similaires, ce module ne s'en occupera pas. Vous devez vous-même assurer la validité des données récupérées.

 Exemple 
 
 Récupération du titre du nœud 
 
 $ Query = new EntityFieldQueryExtraFields (); 
 $ Resultat = $ query-> entityCondition ('entity_type', 'node') 
 -> propertyCondition ('type', 'my_bundle_type') 
 -> propertyCondition ('status', 1) 
 -> addExtraField ('field_myfield', value ', value') 
 -> addExtraField ('field_mynodereffield', nid ', nid') 
 -> addExtraField ('', 'title', 'title', 'node') 
 -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=') 
 -> execute (); 
 Combinaisons possibles: 
 addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL) 
 
 field_name 
 Spécifiez de quel champ le champ supplémentaire doit provenir. S'il s'agit d'une table de base, laissez-la vide et remplissez l'argument de table 
 
 Colonne 
 Spécifiez le nom de la colonne, 
 
 column_alias 
 Spécifiez l'alias de la colonne, 
 
 table 
 Facultativement, ajoutez quelque chose comme nœud ou utilisateur ici (la table de base), 
0
tenken