Puncte:1

Custom Entity "changed" field is unknown

drapel 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.

Puncte:1
drapel de

Când puneți toate elementele împreună, codul dvs. pare absolut corect (am efectuat câteva teste de actualizare a entităților și codul de actualizare nu are nevoie de nimic altceva).

Cu toate acestea, când mă uit la depozitul entității tale, pot vedea că nu există „fieldDefinitions” pentru câmpul „schimbat”. Cea mai bună presupunere este că ceva a mers prost la actualizarea schemei entității.

Vă rog, puteți detalia cum ați efectuat actualizarea? Când mergi la /admin/rapoarte/status, vedeți vreo eroare legată de entitate?

De asemenea, doar pentru a vă asigura că:

  • ID-ul dvs. de entitate este "trialmachine_evaluation"? Spațiul de nume fiind Drupal\trialmachine_evaluation\Entity\Evaluation, mă întreb doar dacă id-ul entității este diferit.
  • ați menționat că hook_update_N() este în fișierul .module. Nu cred că împiedică scriptul de actualizare să-l ruleze, dar ar trebui să fie într-un fișier .install.
Jean da Silva avatar
drapel cn
Mulțumesc pentru ajutor. Pentru a vă răspunde la întrebări: ID-ul entității este „trialmachine_evaluation”, dar are și baza_tabel ca „trial_machine_evaluations”. De asemenea, folosesc hook_update_N() în interiorul .module pentru că au existat alte cârlige ca acesta acolo și pentru că cred că nu pot reinstala acest modul.Despre report_status, da, afișează o eroare care spune să dezinstalați câmpul „schimbat”.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.