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.

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

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 .


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().


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.