Điểm:1

Custom Entity "changed" field is unknown

lá cờ 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.

Điểm:1
lá cờ de

Khi đặt tất cả các phần tử lại với nhau, mã của bạn có vẻ hoàn toàn chính xác (tôi đã chạy một vài thử nghiệm cập nhật thực thể và mã cập nhật không cần bất kỳ thứ gì khác).

Tuy nhiên, khi xem kết xuất thực thể của bạn, tôi có thể thấy rằng không có "định nghĩa trường" cho trường "đã thay đổi". Dự đoán tốt nhất của tôi là đã xảy ra sự cố khi cập nhật lược đồ thực thể.

Bạn có thể vui lòng giải thích về cách bạn thực hiện cập nhật không? Khi đi đến /admin/báo cáo/trạng thái, bạn có thấy bất kỳ lỗi nào liên quan đến Thực thể không?

Ngoài ra, chỉ để đảm bảo:

  • ID thực thể của bạn có phải là "trialmachine_evaluation" không? Không gian tên là Drupal\trialmachine_evaluation\Entity\Evaluation, tôi chỉ tự hỏi liệu id thực thể có khác không.
  • bạn đã đề cập rằng hook_update_N() nằm trong tệp .module. Tôi không nghĩ rằng nó ngăn tập lệnh cập nhật chạy nó, nhưng nó phải ở trong tệp .install.
Jean da Silva avatar
lá cờ cn
Cảm ơn vì đã giúp đỡ. Để trả lời câu hỏi của bạn: Id thực thể là "trialmachine_evaluation", nhưng nó cũng có base_table là "trial_machine_evaluations". Ngoài ra, tôi đang sử dụng hook_update_N() bên trong .module vì có các hook khác như thế này bên trong đó và vì tôi nghĩ rằng tôi không thể cài đặt lại mô-đun này.Về report_status, vâng, nó đang hiển thị lỗi thông báo gỡ cài đặt trường "đã thay đổi".

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.