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.
Respostas:
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 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()
.
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/1226622