Para obter valores de entidades, há duas maneiras:
- Use
field_get_items
e obtenha o valor de um campo - Use
entity_metadata_wrapper
e obtenha o valor de um campo
Embora entity_metadata_wrapper
abstraia as diferenças de idioma, sua API ainda é estranha às vezes, especialmente ao usar o PHP 5.3. Por exemplo, obter o valor de um campo de texto longo geralmente segue esta rota:
$field = $wrapper->field->value();
print $field['safe_value'];
Felizmente, PHP 5.4 suporta esta sintaxe: print $wrapper->field->value()['safe_value'];
.
Mas minha pergunta está mais preocupada com o desempenho. Como eles funcionam? Eles consultam o banco de dados toda vez que solicitam um valor? Será que entity_metadata_wrapper
pede tudo de uma vez? (Tornando-se field_get_item
mais adequado para recuperações de valor único.)
Eu não sou corajoso o suficiente para mergulhar fundo na fonte Drupal.
performance
entities
Florian Margaine
fonte
fonte
field_view_field()
é para renderizar um campo. A função para obter o valor de um campo é field_get_items () .field_get_items()
incorre zerar sobrecarga de banco de dados, então eu acho que é um caso bastante aberta e fechada :)field_get_items()
gera zero custo de banco de dados? Tem que ter seus dados em algum lugar, certo?entity_metadata_wrapper
funciona, em termos de desempenho.field_get_items()
assim a sobrecarga já foi incorrido ... é um pouco de uma rota estrangulada em D7 para ser honestoRespostas:
A resposta curta: field_get_items () tem mais desempenho que entity_metadata_wrapper ().
Confira o código para estas funções:
Ambos exigem que você repasse a entidade, que já foi carregada do banco de dados . Por exemplo:
ou, como você já sugeriu:
Ambas as instâncias me incomodam por causa da lógica boba de tentar obter um valor que já está disponível para você, mas elas certamente são úteis em muitos casos.
Você poderia simplesmente fazer
print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
isso, mas isso geraria erros de aviso do PHP se o campo não tiver um valor, pois você está tentando acessar matrizes que podem não existir (ou seja[LANGUAGE_NONE][0]['value']
). Ultimamente, me vejo fazendo isso frequentemente:o que é muito mais limpo do que fazer:
Se você olhar para o código,
field_get_items())
verá que ele não está fazendo mais nada, garantindo que a matriz do campo tenha dados no idioma atual e, em seguida, retorne-os. Portanto, a sobrecarga de executar uma função tão minúscula é desprezível, mas se você estiver realmente preocupado com o desempenho, pode fazer sua própria verificação se os dados existem e depois imprimi-los.Edit: Como as
field_get_items()
execuçõesfield_language()
realmente teriam um impacto maior no desempenho do que apenas verificar o idioma, portanto, se você já sabe que a linguagem $ entity-> existe, basta escrever sua própria função de super desempenho:fonte
$node = node_load(123);
script 1 e fazer isso novamente em outro lugar, não incorrerá na sobrecarga de desempenho de uma carga e construção completa do objeto - o Drupal apenas atribui a essa variável uma cópia da entidade existente. Se você deseja carregar uma nova cópia, precisará passar$reset = TRUE
para a função de carregamento da entidade. Além disso, veja minhas edições sobre um getter de alto desempenho.if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
não é necessário,isset($node->field_my_field_name[LANGUAGE_NONE][0]
é suficiente.isset($node->field_my_field_name[LANGUAGE_NONE])
, já que o idioma não será definido em um campo vazio? Eu acho que é o delta /[0]
que é redundante.