Загрузка данных пользовательского поля термина таксономии


У меня есть словарь "типы праздников" с терминами таксономии "лыжи" и "пляж". У меня есть настраиваемое поле для этих терминов таксономии "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,
);

}

Author: kiamlaluno, 2015-12-29

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.

И, нет, вам определенно не нужен агрегированный запрос. Вам это нужно, если вы хотите ПОСЧИТАТЬ() или СУММИРОВАТЬ() некоторые значения ваших сущностей.

 2
Author: Berdir, 2015-12-29 17:58:33