Direkt zum Inhalt
Aktualisierung des Entitätsschemas von Drupal 9

Entitäten ermöglichen die Verwaltung von Daten in einer oder mehreren Tabellen. Bei der Entwicklung von Websites oder Anwendungen müssen wir in der Regel Entitäten erstellen.

Diese entwickeln sich je nach Bedarf weiter. Wenn dies zu Beginn der Entwicklung geschieht (ohne wichtige Informationen in der Datenbank), können wir unsere Tabellen leeren und das Modul  Devel Entity Updates verwenden, um die Tabellenschemata zu aktualisieren.

Wenn jedoch später eine Aktualisierung des Tabellenschemas erforderlich wird, verfügt Drupal derzeit nicht über die entsprechenden APIs, um dies zu aktualisieren. Um dies zu beheben, müssen wir unsere eigenen Aktualisierungsfunktionen schreiben.

Unsere Aktualisierungslogik muss im Hook hook_update_N. Lmplementiert werden. Die Grundlogik ist wie folgt: Wir müssen die Daten aus der Tabelle abrufen, diese leeren (in der Regel nur die Spalte), die Aktualisierung anwenden und die Daten wieder einfügen.

Praxisbeispiel 1: Festlegen der Länge (max_length) einer Spalte vom Typ varchar.

Wir haben ein Feld mit der folgenden Konfiguration:

...
$fields['name'] = BaseFieldDefinition::create('string')->setLabel(t('Name'))->setDescription(t('The name of the Site type datas entity.'))->setSettings([
      'max_length' => 50,
      'text_processing' => 0
    ])->setDefaultValue('')->setDisplayOptions('view', [
      'label' => 'above',
      'type' => 'string',
      'weight' => -4
    ])->setDisplayOptions('form', [
      'type' => 'string_textfield',
      'weight' => -4
    ])->setDisplayConfigurable('form', TRUE)->setDisplayConfigurable('view', TRUE)->setRequired(TRUE)->setTranslatable(true);
...

Wir möchten die max_length auf 250 setzen.

function __blockscontent_update_name_max_length($entity_type_id) {
  /**
   *
   * @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $entityStorage
   */
  $entityStorage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
  
  // Retrieve existing field data.
  $database = \Drupal::database();
  $table = $entity_type_id . '_field_data';
  $names = $database->select($table, 'et')->fields('et', [
    'id',
    'langcode',
    'name'
  ])->execute()->fetchAll(\PDO::FETCH_ASSOC);
  // Remove data from the column.
  $database->update($table)->fields([
    'name' => NULL
  ])->execute();
  //
  // si les revisions sont activées.
  if ($entityStorage->getRevisionTable()) {
    $table_revision = $entity_type_id . "_field_revision";
    $names_revision = $database->select($table_revision, 'et')->fields('et', [
      'id',
      'langcode',
      'name'
    ])->execute()->fetchAll(\PDO::FETCH_ASSOC);
    $database->update($table_revision)->fields([
      'name' => NULL
    ])->execute();
  }
  
  // Remove old definition field.
  $updateManager = \Drupal::entityDefinitionUpdateManager();
  $storagedef = $updateManager->getFieldStorageDefinition('name', $entity_type_id);
  $updateManager->uninstallFieldStorageDefinition($storagedef);
  // Load new definition field in code.
  /**
   *
   * @var \Drupal\Core\Entity\EntityFieldManager $fieldManager
   */
  $fieldManager = \Drupal::service('entity_field.manager');
  $fields = $fieldManager->getFieldStorageDefinitions($entity_type_id);
  $updateManager->installFieldStorageDefinition('name', $entity_type_id, "gestion_tache", $fields['name']);
  // Restore entity data in the new schema.
  foreach ($names as $name) {
    $database->update($table)->fields([
      'name' => $name['name']
    ])->condition('id', $name['id'])->condition('langcode', $name['langcode'])->execute();
  }
  // restore revision
  if ($entityStorage->getRevisionTable())
    foreach ($names_revision as $name) {
      $database->update($table_revision)->fields([
        'name' => $name['name']
      ])->condition('id', $name['id'])->condition('langcode', $name['langcode'])->execute();
    }
}

/**
 * Update value max_length from 50 to 250.
 *
 * implement hook_update_8001
 *
 * @see https://www.drupal.org/node/2554097
 */
function blockscontent_update_8001() {
  __blockscontent_update_name_max_length('blocks_contents');
}
Profile picture for user admin Stephane K

Écrit le

Il y'a 2 Jahre
Modifié
Il y'a 2 Wochen
Lädt...
WhatsApp
Support Habeuk : +237 694 900 622
WhatsApp Send