Рейтинг:1

Custom Entity "changed" field is unknown

флаг cn

I'm having a problem I really don't know how to solve, and need your knowledge. I have a custom entity that someone created, and forgot to add the "changed" field. So the objective is to add this field, and updated all entities to set the "changed" field to be equal to the "created" field.

Somehow even if I've updated the entity inserting this changed field, the database shows it, and when dumping the entity this field exists, somehow when I try to set a value to it, it does show an error: enter image description here

I'll show what I've done to insert this field.

Inside the .module

function module_update_9012()
{
  $changed = \Drupal\Core\Field\BaseFieldDefinition::create('changed')
  ->setLabel(t('Changed'))
  ->setDescription(t('The time that the entity was last edited.'));
  
  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('changed', 'trialmachine_evaluation', 'trialmachine_evaluation', $changed);
}

Inside the Evaluation entity

use EntityChangedTrait;
public static function baseFieldDefinitions(EntityTypeInterface $entity_type)
{
     $fields = parent::baseFieldDefinitions($entity_type);
     //There are other fields, but they are not needed for this example.
     $fields['changed'] = BaseFieldDefinition::create('changed')
        ->setLabel(t('Changed'))
        ->setDescription(t('The time that the entity was last edited.'));
     return $fields;
}

I've also extended the ContentEntityBase and implemented the EvaluationInterface. While in the EvaluationInterface I've extended the ContentEntityInterface and EntityChangedInterface.

I added the changed to entity_keys on the annotations, and run drush cr to rebuild the cache, and everything.

Then, I'm trying to simply update the field programmatically using a route with a controller to test it. This is what I did:

$evaluations = \Drupal::entityTypeManager()->getStorage('trialmachine_evaluation')->loadMultiple();

if (!empty($evaluations)) {
   foreach ($evaluations as $item) {
      if (empty($item->changed->value)) {
         //$item->set('changed', $item->created->value);
         //$item->changed->value = $item->created->value;
         //$item->changed = $item->created->value;
         $item->setChangedTime($item->created->value);
         $item->save();
      }
   }
}

In this example there are commented lines to show what I've tried to do, but in any of these atempts the same error appeared.

Dump of the entity object. The data are '---' for privacy reasons, there are right data types in there.

object(Drupal\trialmachine_evaluation\Entity\Evaluation)[967]
  protected 'values' => 
    array (size=7)
      'id' => 
        array (size=1)
          'x-default' => string '---' (length=1)
      'user_id' => 
        array (size=1)
          'x-default' => string '---' (length=1)
      'campaign_id' => 
        array (size=1)
          'x-default' => string '---' (length=1)
      'order_id' => 
        array (size=1)
          'x-default' => string '---' (length=1)
      'answers' => 
        array (size=1)
          'x-default' => string '---' (length=66)
      'created_at' => 
        array (size=1)
          'x-default' => string '---' (length=19)
      'changed' => 
        array (size=1)
          'x-default' => null
  protected 'fields' => 
    array (size=0)
      empty
  protected 'fieldDefinitions' => 
    array (size=6)
      'id' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[971]
          protected 'type' => string 'integer' (length=7)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[972]
              ...
          protected 'definition' => 
            array (size=7)
              ...
          protected 'typedDataManager' => null
      'user_id' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[975]
          protected 'type' => string 'entity_reference' (length=16)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[976]
              ...
          protected 'definition' => 
            array (size=8)
              ...
          protected 'typedDataManager' => null
      'campaign_id' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[979]
          protected 'type' => string 'entity_reference' (length=16)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[980]
              ...
          protected 'definition' => 
            array (size=7)
              ...
          protected 'typedDataManager' => null
      'order_id' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[983]
          protected 'type' => string 'entity_reference' (length=16)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[984]
              ...
          protected 'definition' => 
            array (size=7)
              ...
          protected 'typedDataManager' => null
      'answers' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[987]
          protected 'type' => string 'string' (length=6)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[988]
              ...
          protected 'definition' => 
            array (size=6)
              ...
          protected 'typedDataManager' => null
      'created_at' => 
        object(Drupal\Core\Field\BaseFieldDefinition)[990]
          protected 'type' => string 'datetime' (length=8)
          protected 'propertyDefinitions' => null
          protected 'schema' => null
          protected 'indexes' => 
            array (size=0)
              ...
          protected 'itemDefinition' => 
            object(Drupal\Core\Field\TypedData\FieldItemDataDefinition)[991]
              ...
          protected 'definition' => 
            array (size=7)
              ...
          protected 'typedDataManager' => null
  protected 'languages' => null
  protected 'langcodeKey' => string '' (length=0)
  protected 'defaultLangcodeKey' => string 'default_langcode' (length=16)
  protected 'activeLangcode' => string 'x-default' (length=9)
  protected 'defaultLangcode' => string 'und' (length=3)
  protected 'translations' => 
    array (size=1)
      'x-default' => 
        array (size=1)
          'status' => int 1
  protected 'translationInitialize' => boolean false
  protected 'newRevision' => boolean false
  protected 'isDefaultRevision' => boolean true
  protected 'entityKeys' => 
    array (size=7)
      'bundle' => string 'trialmachine_evaluation' (length=23)
      'id' => string '---' (length=1)
      'campaign_id' => string '---' (length=1)
      'answers' => string '---' (length=66)
      'user_id' => string '---' (length=1)
      'order_id' => string '---' (length=1)
      'created_at' => string '---' (length=19)
  protected 'translatableEntityKeys' => 
    array (size=0)
      empty
  protected 'validated' => boolean false
  protected 'validationRequired' => boolean false
  protected 'loadedRevisionId' => null
  protected 'revisionTranslationAffectedKey' => string 'revision_translation_affected' (length=29)
  protected 'enforceRevisionTranslationAffected' => 
    array (size=0)
      empty
  protected 'entityTypeId' => string 'trialmachine_evaluation' (length=23)
  protected 'enforceIsNew' => null
  protected 'typedData' => null
  protected 'cacheContexts' => 
    array (size=0)
      empty
  protected 'cacheTags' => 
    array (size=0)
      empty
  protected 'cacheMaxAge' => int -1
  protected '_serviceIds' => 
    array (size=0)
      empty
  protected '_entityStorages' => 
    array (size=0)
      empty
  protected 'isSyncing' => boolean false

Thanks for reading.

Рейтинг:1
флаг de

При объединении всех элементов ваш код кажется абсолютно правильным (я провел несколько тестов обновления сущностей, и коду обновления больше ничего не нужно).

Тем не менее, глядя на дамп вашего объекта, я вижу, что для поля «изменено» нет «fieldDefinitions». Я думаю, что что-то пошло не так при обновлении схемы объекта.

Не могли бы вы рассказать, как вы выполнили обновление, пожалуйста? Когда собираешься /admin/отчеты/статус, вы видите какую-либо ошибку, связанную с Entity?

Также, просто чтобы убедиться:

  • Ваш идентификатор объекта "trialmachine_evaluation"? Пространство имен Drupal\trialmachine_evaluation\Entity\Evaluation, мне просто интересно, отличается ли идентификатор объекта.
  • вы упомянули, что hook_update_N() находится в файле .module. Я не думаю, что это мешает запуску сценария обновления, но он должен быть в файле .install.
Jean da Silva avatar
флаг cn
Спасибо за помощь. Чтобы ответить на ваши вопросы: идентификатор объекта — «trialmachine_evaluation», но он также имеет base_table как «trial_machine_evaluations». Кроме того, я использую hook_update_N() внутри .module, потому что там были другие подобные хуки, и потому что я думаю, что не могу переустановить этот модуль.Что касается report_status, да, он показывает ошибку, говорящую об удалении поля «изменено».

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.