Score: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.

Score:1
ธง de

เมื่อนำองค์ประกอบทั้งหมดมารวมกัน โค้ดของคุณดูเหมือนถูกต้องทุกประการ (ฉันทำการทดสอบการอัปเดตเอนทิตีสองสามรายการ และโค้ดการอัปเดตก็ไม่ต้องการสิ่งอื่นใด)

แต่เมื่อดูการถ่ายโอนเอนทิตีของคุณ ฉันเห็นว่าไม่มี "fieldDefinitions" สำหรับฟิลด์ "เปลี่ยนแปลง" การเดาที่ดีที่สุดของฉันคือมีบางอย่างผิดพลาดเมื่ออัปเดตสคีมาของเอนทิตี

คุณช่วยอธิบายรายละเอียดเกี่ยวกับวิธีการอัปเดตได้ไหม เมื่อไป /ผู้ดูแลระบบ/รายงาน/สถานะคุณเห็นข้อผิดพลาดเกี่ยวกับเอนทิตีหรือไม่

นอกจากนี้ เพื่อให้แน่ใจว่า:

  • รหัสเอนทิตีของคุณคือ "trialmachine_evaluation" หรือไม่ เนมสเปซเป็น Drupal\trialmachine_evaluation\Entity\Evaluation ฉันแค่สงสัยว่ารหัสเอนทิตีนั้นแตกต่างกันหรือไม่
  • คุณกล่าวว่า hook_update_N() อยู่ในไฟล์ .module ฉันไม่คิดว่ามันป้องกันสคริปต์อัปเดตจากการเรียกใช้ แต่ควรอยู่ในไฟล์ .install
Jean da Silva avatar
cn flag
ขอบคุณสำหรับการช่วยเหลือ. เพื่อตอบคำถามของคุณ: รหัสเอนทิตีคือ "trialmachine_evaluation" แต่ก็มี base_table เป็น "trial_machine_evaluation" นอกจากนี้ ฉันใช้ hook_update_N() ภายใน .module เพราะมี hook อื่นๆ แบบนี้อยู่ข้างใน และเพราะฉันคิดว่าฉันไม่สามารถติดตั้งโมดูลนี้ใหม่ได้เกี่ยวกับ report_status ใช่ มันแสดงข้อผิดพลาดที่บอกให้ถอนการติดตั้งฟิลด์ "เปลี่ยนแปลง"

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา