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.
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.
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_type
que possui um campo nomeado field_foo
com 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();
Acho que a principal razão preferindo EntityFieldQuery
mais 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 .
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 aentity_load()
chamada subsequente , e isso adiciona muito ruído ao código, IMHO: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()
.fonte
entity_metadata_wrapper()
ajuda aqui. Você ainda precisa carregar a entidade.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,
entityFieldQuery
use innerJoin para buscar campos. Se você precisar de um leftJoin por qualquer motivo, ficará preso ... http://drupal.org/node/1226622fonte