Pourquoi devrais-je utiliser EntityFieldQuery quand je peux faire le même travail avec Db_select () pour récupérer la valeur.
Il serait préférable que quelqu'un puisse fournir un exemple, pas seulement un lien.
Pourquoi devrais-je utiliser EntityFieldQuery quand je peux faire le même travail avec Db_select () pour récupérer la valeur.
Il serait préférable que quelqu'un puisse fournir un exemple, pas seulement un lien.
Réponses:
Je pense que le fait est que la syntaxe est beaucoup plus simple et que le code sera plus compréhensible.
Par exemple, si vous voulez des nœuds de type my_type
qui ont un champ nommé field_foo
avec la valeur $val
, avec Db_Select, yuoll fait quelque chose comme:
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
Ce qui est beaucoup plus simple avec EntityFieldQuery:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
Je pense que la raison principale préférant EntityFieldQuery
plus db_select
est que vous ne devez pas connaître la structure de niveau inférieur, en d' autres termes: comment les choses sont stockées dans la base de données. Cela améliore le couplage lâche .
EntityFieldQuery (EFQ) ne renverra que les ID d'entité. Si vous souhaitez accéder aux données des entités, vous devrez appelerentity_load()
, ce qui, parmi le chargement des données, fera en sorte que toutes les choses sous-jacentes qui ne vous intéressent pas normalement (comme le chargement des champs, l'appel d'autres hooks de modules, etc.) soient faites . Bien sûr, cela entraîne deux requêtes SQL et beaucoup de frais généraux, mais c'est le prix à payer pour l'abstraction.
Quant à la syntaxe EFQ étant plus claire, je pense que c'est beaucoup plus une question de préférences personnelles. Par exemple, je ne pense pas que l'EFQ soit plus clair. Notez qu'un db_select()
remplacement de travail avec EFQ doit inclure le test de valeur de retour et l' entity_load()
appel suivant, et cela ajoute beaucoup de bruit au code, à mon humble avis :
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
Donc, pour répondre à votre question: utilisez EFQ si vos entités sont complètes (par exemple sont modifiables, peuvent être utilisées par d'autres modules, etc.) et / ou vous pensez que sa syntaxe est plus claire. Si d'autres cas, l'utilisation peut utiliser db_select()
.
entity_metadata_wrapper()
aide ici. Vous devez toujours charger l'entité.
EntityFieldQuery est beaucoup plus limité que db_select()
, donc vous devriez avoir une très bonne raison de ne pas l'utiliser db_select()
(voir la réponse de Bart), qui est suffisamment lisible et beaucoup plus flexible.
Par exemple, entityFieldQuery
utilisez innerJoin pour récupérer des champs. Si vous avez besoin d'un leftJoin pour une raison quelconque, vous êtes pris au piège ...
http://drupal.org/node/1226622