Чтобы получить значения от сущностей, есть два способа:
- Используйте
field_get_items
и получите значение поля - Используйте
entity_metadata_wrapper
и получите значение поля
Хотя entity_metadata_wrapper
абстрагируется от языковых различий, его API иногда все еще неуклюж, особенно при использовании PHP 5.3. Например, получение значения длинного текстового поля обычно идет по этому пути:
$field = $wrapper->field->value();
print $field['safe_value'];
К счастью, PHP 5.4 поддерживает этот синтаксис: print $wrapper->field->value()['safe_value'];
.
Но мой вопрос больше касается производительности. Как они оба работают? Они запрашивают базу данных каждый раз, когда запрашивают значение? Запрашивает ли entity_metadata_wrapper
все сразу? (Создание field_get_item
более подходящих для поиска одного значения.)
Я не достаточно смел, чтобы глубоко погрузиться в источник Drupal.
performance
entities
Флориан Маргейн
источник
источник
field_view_field()
для рендеринга поля. Функция для получения значения поля - field_get_items () .field_get_items()
требует никаких затрат на базу данных, так что я думаю, что это довольно открытый и закрытый случай :)field_get_items()
получается, что у вас нет базы данных? Он должен где-то получить свои данные, верно?entity_metadata_wrapper
работает, с точки зрения производительности.field_get_items()
так что накладные расходы уже были понесены ... если честно, это немного удушенный маршрут в D7Ответы:
Краткий ответ: field_get_items () более производительный, чем entity_metadata_wrapper ().
Проверьте код для этих функций:
Оба требуют, чтобы вы передали сущность, которая уже была загружена из базы данных . Например:
или, как вы уже предложили:
Оба эти случая как бы беспокоят меня из-за глупой логики в попытке получить значение, которое уже доступно для вас, но они, безусловно, полезны во многих случаях.
Вы можете просто сделать это,
print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
но это приведет к ошибкам уведомления PHP, если поле не имеет значения, так как вы пытаетесь получить доступ к массивам, которые могут не существовать (то есть[LANGUAGE_NONE][0]['value']
). Я часто делаю это в последнее время:что намного чище, чем делать:
Если вы посмотрите на код,
field_get_items())
то увидите, что он ничего не делает, а только проверяет, что массив поля содержит данные на текущем языке, а затем возвращает их. Таким образом, издержки на запуск такой крошечной функции незначительны, но если вы действительно обеспокоены производительностью, вы можете просто проверить, существуют ли данные, а затем распечатать их.Редактировать: Поскольку
field_get_items()
запускиfield_language()
на самом деле повлияют на производительность больше, чем просто проверка языка, поэтому, если вы уже знаете, что существует $ entity-> language, вы можете просто написать свою собственную супер-производительную функцию:источник
$node = node_load(123);
сценарий 1 и делаете это снова в другом месте, вы не понесете накладных расходов при полной загрузке и сборке объекта - Drupal просто назначает этой переменной копию существующего объекта. Если вы хотите загрузить новую копию, вам нужно перейти$reset = TRUE
к функции загрузки объекта. Кроме того, посмотрите мои правки, касающиеся супер результативного добытчика.if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
не нужно,isset($node->field_my_field_name[LANGUAGE_NONE][0]
достаточно.isset($node->field_my_field_name[LANGUAGE_NONE])
, поскольку язык не будет установлен в пустом поле? Я думаю, что это дельта /[0]
это избыточно.