Загрузка данных пользовательского поля термина таксономии
У меня есть словарь "типы праздников" с терминами таксономии "лыжи" и "пляж". У меня есть настраиваемое поле для этих терминов таксономии "field_activityid", которое относится к устаревшей системе.
Я хочу загрузить все эти термины, чтобы, просматривая список регионов, я мог добавить идентификатор taxonomy_term в поле ссылки на сущность, и мне нужно получить устаревший идентификатор activityid для запроса внешнего API.
У меня возникли проблемы с EntityQuery, который не распознает "типы праздников" как связка терминов таксономии, я тоже попробовал "тип". Я также не получаю работу entityQueryAggregate, поэтому подумал, что задам здесь вопрос, чтобы узнать, существует ли "правильный" способ запроса пользовательских полей в терминах таксономии.
Добавляя здесь пример, который создает "Исключение QueryException: "пакет"не найден"
$holidayTypesQuery = \Drupal::entityQueryAggregate('taxonomy_term');
$holidayTypesQuery->conditionAggregate('bundle', 'holiday_types');
$ids = $holidayTypesQuery->execute();
$storage = \Drupal::entityManager()->getStorage('taxonomy_term');
$entities = $storage->loadMultiple($ids);
Если я изменю 'bundle' на 'vid', это приведет к следующим ошибкам:
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[42000]:
Syntax error or access violation: 1305 FUNCTION purkidev.holiday_types does not exist:
SELECT holiday_types(taxonomy_term_field_data.vid)
AS vid_holiday_types
FROM {taxonomy_term_data} base_table
LEFT JOIN {taxonomy_term_field_data} taxonomy_term_field_data
ON taxonomy_term_field_data.tid = base_table.tid
INNER JOIN {taxonomy_term_field_data} taxonomy_term_field_data_2
ON taxonomy_term_field_data_2.tid = base_table.tid
HAVING (holiday_types(taxonomy_term_field_data_2.vid) = :db_placeholder_0); Array ( [:db_placeholder_0] => )
in Drupal\purkitest\Controller\PurkitestController->simple() (line 89 of /Users/steve/Sites/purkidev/modules/purkitest/src/Controller/PurkitestController.php).
Попытка без агрегата:
$holidayTypesTIDs = \Drupal::entityQuery('taxonomy_term')
->condition('vid', 'holiday_types')->execute();
$taxonomyTermStorage = \Drupal::entityManager()->getStorage('taxonomy_term');
$holidayTypes = $taxonomyTermStorage->loadMultiple($holidayTypesTIDs);
foreach ($holidayTypes as $holidayType) {
dpm($holidayType);
}
Это работает, но когда я dpm($Типы праздников) Я не понимаю что-нибудь в полях:
[fields:protected] => Array
(
)
...следовательно, почему я пытался агрегировать, как я думал, это объединило поля.
Итак, могу ли я получить доступ к значению моего field_activityid отсюда, и если да, то как? Пробовали различные случайные вещи, такие как
dpm($holidayType->field_activityid->value())
, который производит
Call to undefined method Drupal\Core\Field\FieldItemList::value()
Следуя комментариям бердира, вот последняя целая функция... который теперь работает - спасибо всем за помощь в моем синтаксисе!
public function simple() {
$holidayTypesTIDs = \Drupal::entityQuery('taxonomy_term')
->condition('vid', 'holiday_types')->execute();
$taxonomyTermStorage = \Drupal::entityManager()->getStorage('taxonomy_term');
$holidayTypes = $taxonomyTermStorage->loadMultiple($holidayTypesTIDs);
$markup = '';
foreach ($holidayTypes as $holidayType) {
$markup .= "<p>Holiday Type: ";
$markup .= $holidayType->getName();
$markup .= "</p><p>TID: ";
$markup .= $holidayType->id();
$markup .= "</p><p>ActivityID: ";
$markup .= $holidayType->field_activityid->value;
$markup .= "</p><p>";
}
return array(
'#markup' => $markup,
);
}
1 answers
Ваш запрос сущности работает нормально (без агрегирования). dpm()
не работает в D8 для сущностей контента, попробуйте вместо этого kint(), но это также будет вводить в заблуждение.
Ваша последняя попытка была почти правильной: ->value
- это свойство (на самом деле волшебное свойство), а не метод. Так что это должно работать нормально:
$holidayType->field_activityid->value
Как уже упоминалось в нескольких вопросах, взгляните на http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet ; он немного устарел, но все еще представляет собой отличный обзор API сущности контента (поля).
Если вы действительно хотите использовать dpm()
/kint()
, затем всегда запускайте его на $entity->toArray()
. Это даст вам структуру массива полей, вы можете перевести это 1:1 в свойства объекта, и это будет работать нормально. Для дельт используйте $holidayType->field_activityid[1]->value
; не указывая значение по умолчанию дельта 0.
И, нет, вам определенно не нужен агрегированный запрос. Вам это нужно, если вы хотите ПОСЧИТАТЬ() или СУММИРОВАТЬ() некоторые значения ваших сущностей.