web-dev-qa-db-fra.com

EntityFieldQuery vs Db_select ()

Pourquoi devrais-je utiliser EntityFieldQuery alors que 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.

18
j2r

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 souhaitez 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();
11
IcanDivideBy0

Je pense que la raison principale qui préfère EntityFieldQuery à db_select est que vous n'avez pas besoin de 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 couplage lâche .

14
Bart

EntityFieldQuery (EFQ) ne renverra que les ID d'entité. Si vous souhaitez accéder aux données des entités, vous devrez appeler entity_load(), qui, parmi le chargement des données, fera en sorte que toutes les choses sous-jacentes dont vous ne vous souciez pas normalement (comme le chargement de champs, l'appel d'autres modules crochets etc.) sont réalisés. 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 pense pas que EFQ est plus clair. Notez qu'un remplacement de db_select() de travail avec EFQ doit inclure le test de valeur de retour et l'appel entity_load() 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, use peut utiliser db_select().

3
flaviovs

EntityFieldQuery est beaucoup plus limité que db_select(), vous devriez donc avoir une très bonne raison de ne pas 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 les champs. Si vous avez besoin d'un leftJoin pour une raison quelconque, vous êtes pris au piège ... http://drupal.org/node/1226622

1
yann_yinn