Drupal 8 & 9 - Hook Update - Tester si une table existe, la supprimer et la recréer

Posté le Vendredi 5 juin 2020 - 09:25

Pour un projet drupal, j'avais besoin de créer deux tables identiques dans une base de données séparée sur un serveur différent, afin de servir de cache pour un webservice.

Voici le code que j'ai utilisé pour créer ces tables avec un test si les tables existe avant de les récréer (si j'ai besoin de mettre à jour le modèle par exemple).

Définition du schéma de ma table dans le fichier MODULE.install :

# Le nom de cette fonction est personnel, je n'utilise pas le HOOK_schema() ici
function MODULE_schema_db_cache() {
  $schema['proposals'] = [
    'description' => 'distribProposal',
    'fields' => [],
    'primary key' => ['id'],
    'indexes' => [
      'id' => ['id'],
      'room_type_code' => ['room_type_code'],
    ],
  ];

  $schema['proposals']['fields']['id'] = [
    'description' => 'id',
    'type' => 'serial',
    'not null' => TRUE,
    'unsigned' => TRUE,
  ];

  $schema['proposals']['fields']['name'] = [
    'type' => 'varchar',
    'length' => 255,
  ];
  //Ajout des champs supplémentaires ici
}

Création des tables via un hook_update() :

/**
 * DB cache ws - Creation tables
 */
function MODULE_core_update_8005() {
  try {
    // Je passe sur une autre base de données définis dans mes settings 
    // ici : $databases['cache_ws']['default']
    Database::setActiveConnection('cache_ws');
    // Je récupère le schéma
    $db = MODULE_schema_db_cache();
    if($schema = Database::getConnection()->schema()) {
      // Je veux avoir deux fois la même table afin de passer sur la seconde quand je met à jour la première
      $tables = ['proposals_a', 'proposals_b'];
      foreach ($tables as $table) {
        // Si la table existe déjà je la supprime
        if ($schema->tableExists($table)) {
          $schema->dropTable($table);
        }
        // Puis je la recrée
        $schema->createTable($table, $db['proposals']);
      }
    }
  }
  catch (Exception $e) {
    // En cas de soucis je commence par basculer sur la base de donnée par défaut
    Database::setActiveConnection();

    // Puis je lance une erreur
    throw new \Drupal\Core\Utility\UpdateException(t('vacanceole_core_update_8005 error : @message', ['@message' => $e->getMessage()]));
  }
    // Si tout s'est bien passé je repasse sur la base de données par défaut.
  Database::setActiveConnection();
  return t('Tables proposals_a and proposals_b successfully created');
}

Pour bien faire je devrais ajouter l'installation de mes tables dans un hook install, en faisant appel à la fonction que je viens de définir :

function MODULE_install() {
  MODULE_update_8005();
}

 

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...