Obtenir uniquement certains champs avec EntityFieldQuery?

19

Drupal 7 a 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 = ???
Fedir RYKHTIK
la source

Réponses:

10

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 ajouter 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 bons exemples de remplacement.

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

stefgosselin
la source
OK je vois ! Donc, probablement, il est possible de redéfinir la méthode "EntityFieldQuery" "buildQuery", pour alterner les champs résultants. Cela pourrait probablement fonctionner.
Fedir RYKHTIK
11

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.

mikeytown2
la source
Créé un bac à sable pour cela car le module Apache Solr avait quelques inconvénients drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
A voté cette réponse simplement pour le module (actuellement sandbox) créé par mikeytown2 (merci!)
Oliver Coleman
Le lien dans la réponse ne semble pas fonctionner. Il dit "Vous devez vous connecter ou vous inscrire avant de continuer."
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Mise à jour du lien
mikeytown2
0

Quiconque souhaite toujours obtenir des champs à partir d'un EFQ jetez un œil aux champs supplémentaires EFQ module .

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 vous donne uniquement l'ID d'entité, le bundle et le type d'entité. Ce module ajoute une couche supplémentaire en plus de cela sans faire de charges d'entité supplémentaires! 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 de prudence, 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 ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', valeur ', valeur')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> exécuter ();
Combinaisons possibles:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

nom de domaine
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 table

colonne
Spécifiez le nom de la colonne,

alias_colonne
Spécifiez l'alias de la colonne,

table
Facultativement, ajoutez quelque chose comme nœud ou utilisateur ici (la table de base),
tenken
la source
J'ai essayé à la fois ce module (EFQ Extra Fields) et le module (actuellement sandbox) de mikeytown2 et ce dernier semblait beaucoup mieux (plus agréable à utiliser, sortie plus sensible) et semble également être beaucoup mieux maintenu que le premier. Le module sandbox de mikeytown2 se trouve sur drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman