EntityFieldQuery vs Db_select ()

19

Por que devo usar EntityFieldQuery quando posso fazer o mesmo trabalho com Db_select () para buscar o valor.

Seria melhor se alguém pudesse fornecer um exemplo, não apenas um link.

j2r
fonte

Respostas:

11

Eu acho que o ponto é que a sintaxe é muito mais simples e o código será mais compreensível.

Por exemplo, se você quiser nós com o tipo my_typeque possui um campo nomeado field_foocom o valor $val, com Db_Select, você fará algo como:

$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();

O que é muito mais simples com o EntityFieldQuery:

$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
IcanDivideBy0
fonte
14

Acho que a principal razão preferindo EntityFieldQuerymais db_selecté que você não tem que saber sobre a estrutura de nível inferior, em outras palavras: como o material é armazenado no banco de dados. Isso melhora o acoplamento solto .

Bart
fonte
6
Isso está correto, embora vá ainda mais longe. O armazenamento em campo é plugável. A implementação padrão armazena dados de campo em uma tabela separada por campo no banco de dados, mas pode ser substituída; existe, por exemplo, uma implementação que permite armazenar dados de campo no MongoDB. Se você deseja que seu código seja portátil e não funcione apenas na configuração específica do site, use EntityFieldQuery.
Berdir
3

EntityFieldQuery (EFQ) retornará apenas IDs de entidade. Se você quiser acessar os dados das entidades, precisará chamar entity_load(), que, ao carregar os dados, garantirá que todas as coisas subjacentes com as quais você normalmente não se importa (como carregar campos, chamar outros ganchos de módulos etc.) sejam feitas . Obviamente, isso resulta em duas consultas SQL e muita sobrecarga, mas esse é o preço a pagar pela abstração.

Quanto à sintaxe do EFQ ser mais clara, acho que é muito mais uma questão de preferências pessoais. Eu, por exemplo, não acho que o EFQ seja mais claro. Observe que uma db_select()substituição funcional do EFQ deve incluir o teste de valor de retorno e a entity_load()chamada subsequente , e isso adiciona muito ruído ao código, IMHO:

$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();
}

Portanto, respondendo à sua pergunta: use EFQ se suas entidades tiverem todos os recursos (por exemplo, podem ser usadas em campo, podem ser usadas por outros módulos etc.) e / ou você acha que sua sintaxe é mais clara. Se outros casos, o uso pode usar db_select().

flaviovs
fonte
Não exatamente, você pode usar entity_metadata_wrapper e acessar apenas o que você precisa.
21716 Kevin
Não vejo como entity_metadata_wrapper()ajuda aqui. Você ainda precisa carregar a entidade.
flaviovs
1

EntityFieldQuery é muito mais limitado do que db_select(), portanto, você deve ter um bom motivo para não usardb_select() (consulte a resposta bart), que é legível o suficiente e muito mais flexível.

Por exemplo, entityFieldQueryuse innerJoin para buscar campos. Se você precisar de um leftJoin por qualquer motivo, ficará preso ... http://drupal.org/node/1226622

yann_yinn
fonte
Bem, eu gostaria de saber por que minha resposta tinha um "-1". Sim, o entityFieldQuery é mais bonito, mas menos eficiente que o db_select, que é uma API muito boa, robusta e completa ... Eu removo grande parte do meu entityFieldQuery do meu código porque era muito limitado para casos de uso específicos, acho que definitivamente merecia ser apontou. De qualquer forma.
precisa saber é o seguinte
1
Acho que alguns não gostam da sua resposta porque não reconhecem como o entityFieldQuery é uma camada de abstração acima de diferentes métodos de armazenamento, o que é um recurso interessante. Eu trabalho em muitos sites onde sabemos que, digamos, o MySQL sempre será o banco de dados para x / y / z e também preferimos escrever consultas de banco de dados mais enxutas quando necessário. Não acho que o entityFieldQuery seja mais bonito que o db_select. As duas comparações na parte superior da página são quase idênticas visualmente.
Charlie Schliesser
Sim, foi por isso que escrevi "Ver resposta do Bart". Exceto por este caso de uso especial, o db_select será mais eficiente e muito mais flexível.
yann_yinn 23/06
Eu concordo completamente.
Charlie Schliesser