You are here

function flag_update_8401 in Flag 8.4

Fix schema changes in 4.0-alpha2.

File

./flag.install, line 103
Flag module install/schema/update hooks.

Code

function flag_update_8401() {
  $bundle_schema = [
    'description' => 'The Flag ID.',
    'type' => 'varchar_ascii',
    'length' => \Drupal\Core\Entity\EntityTypeInterface::BUNDLE_MAX_LENGTH,
    // 'binary' => FALSE,
    'not null' => TRUE,
  ];

  /** @var \Drupal\Core\Database\Schema $schema */
  $schema = \Drupal::database()
    ->schema();
  $schema
    ->changeField('flagging', 'flag_id', 'flag_id', $bundle_schema);
  $schema
    ->dropIndex('flagging', 'flag_id');
  $schema
    ->dropIndex('flagging', 'flagging_field__flag_id__target_id');
  $schema
    ->addIndex('flagging', 'flagging_field__flag_id__target_id', [
    'flag_id',
  ], [
    'fields' => [
      'flag_id' => $bundle_schema,
    ],
  ]);

  // Update the field storage repository.

  /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $efm */
  $efm = \Drupal::service('entity_field.manager');

  /** @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface $kv */
  $kv = \Drupal::service('keyvalue');

  /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $repo */
  $repo = \Drupal::service('entity.last_installed_schema.repository');
  $efm
    ->clearCachedFieldDefinitions();
  $storage_definition = $efm
    ->getFieldStorageDefinitions('flagging')['flag_id'];
  $repo
    ->setLastInstalledFieldStorageDefinition($storage_definition);

  // Update the stored field schema.
  // @todo: There has to be a better way to do this.
  $kv_collection = 'entity.storage_schema.sql';
  $kv_name = 'flagging.field_schema_data.flag_id';
  $field_schema = $kv
    ->get($kv_collection)
    ->get($kv_name);
  $field_schema['flagging']['fields']['flag_id'] = $bundle_schema;
  $field_schema['flagging']['indexes']['flagging_field__flag_id__target_id'] = [
    'flag_id',
  ];
  $kv
    ->get($kv_collection)
    ->set($kv_name, $field_schema);
}