Eu tenho um grande número de NIDs e preciso de um valor de campo de cada nó. Existe alguma maneira de evitar a sobrecarga de carregar o nó inteiro para obter um valor de campo?
Eu não acho que exista algo incorporado à API, mas em uma pitada você pode simplesmente consultar o banco de dados diretamente:
$entity_type = 'node';
$bundle = 'page';
$nids = array(1, 2, 3);
$field_values = db_select('field_revision_FIELD_NAME', 'f')
->fields('f', array('entity_id', 'FIELD_NAME_value'))
->condition('entity_type', $entity_type)
->condition('bundle', $bundle)
->condition('entity_id', $nids, 'IN')
->condition('deleted', 0)
->execute()
->fetchAllKeyed();
Após a execução, você deverá ter uma matriz de valores de campo, codificada pelo nid do respectivo nó.
Vale lembrar que o nome da coluna não será necessariamente FIELD_NAME_value
; por exemplo, um campo de referência de nó teria um nome de coluna de FIELD_NAME_nid
. Qual você usará dependerá do seu tipo de campo.
ATUALIZAR
Parece que existe uma maneira de fazer isso com a API, mas não é bonito e ainda envolve uma consulta manual:
// Get the field meta data for the field_id.
$field_name = 'field_something';
$field_info = field_info_field($field_name);
$field_id = $field_info['id'];
// Load up the properties from the node table.
$nids = array(1, 2, 3);
$sql = 'SELECT * FROM {node} WHERE nid IN (:nids)';
$nodes = db_query($sql, array(':nids' => $nids))->fetchAllAssoc('nid');
// Attach the single field to all nodes.
field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));
Esse método aproveita o $options
parâmetro field_attach_load()
especificando um ID de campo para o qual carregar dados. Vale a pena notar, de acordo com os documentos:
Observe que as entidades retornadas podem conter dados para outros campos, por exemplo, se forem lidos em um cache.
Portanto, o código pode parecer carregar dados de campo extras, mas qualquer coisa que não seja o campo especificado será proveniente do cache.
Acho uma maneira um pouco mais limpa usando uma entidadeCondição e carga de anexação de campo.
Na postagem do blog http://timonweb.com/loading-only-one-field-from-an-entity-or-node
fonte
Para evitar carregar o nó um por um com um grande número de NIDs, você pode usar o
node_load_multiple()
que carregará vários nós de uma só vez:Normalmente, o carregamento dos nós é armazenado em cache e é rápido se você estiver usando o cache de memória (como memcached), mas pode ser lento se você tiver muitos módulos instalados (como Pathauto, etc.).
Outra maneira é reutilizar o objeto existente, portanto verifique se você pode carregá-lo diretamente do cache (por exemplo, via
form_get_cache
se faz parte do formulário) ou da$_POST
solicitação.Outra maneira é usar
EntityFieldQuery
com vários NIDs, por exemploque buscará os valores diretamente do banco de dados.
fonte