migrations/Version20251022100100.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * Rename clientId columns to client_id for consistency.
  8.  * Ensures all client foreign key columns follow snake_case naming convention.
  9.  */
  10. final class Version20251022100100 extends AbstractMigration
  11. {
  12.     public function getDescription(): string
  13.     {
  14.         return 'Rename clientId to client_id for naming consistency';
  15.     }
  16.     private function columnExists(string $tablestring $column): bool
  17.     {
  18.         $result $this->connection->fetchOne(
  19.             "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
  20.              WHERE TABLE_SCHEMA = DATABASE() 
  21.              AND TABLE_NAME = ? 
  22.              AND COLUMN_NAME = ?",
  23.             [$table$column]
  24.         );
  25.         
  26.         return $result 0;
  27.     }
  28.     public function up(Schema $schema): void
  29.     {
  30.         // Rename clientId to client_id in client_config table
  31.         if ($this->columnExists('client_config''clientId')) {
  32.             $this->addSql('ALTER TABLE client_config CHANGE clientId client_id INT DEFAULT NULL');
  33.         }
  34.         // Rename clientId to client_id in client_config_variable table
  35.         if ($this->columnExists('client_config_variable''clientId')) {
  36.             // Step 1: Find and drop existing foreign key
  37.             $fkResult $this->connection->fetchAllAssociative(
  38.                 "SELECT CONSTRAINT_NAME 
  39.                  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  40.                  WHERE TABLE_SCHEMA = DATABASE() 
  41.                  AND TABLE_NAME = 'client_config_variable' 
  42.                  AND COLUMN_NAME = 'clientId' 
  43.                  AND REFERENCED_TABLE_NAME IS NOT NULL"
  44.             );
  45.             
  46.             foreach ($fkResult as $fk) {
  47.                 $this->addSql('ALTER TABLE client_config_variable DROP FOREIGN KEY ' $fk['CONSTRAINT_NAME']);
  48.             }
  49.             
  50.             // Step 2: Drop indexes (only if they exist)
  51.             $indexResult $this->connection->fetchAllAssociative(
  52.                 "SELECT DISTINCT INDEX_NAME 
  53.                  FROM INFORMATION_SCHEMA.STATISTICS 
  54.                  WHERE TABLE_SCHEMA = DATABASE() 
  55.                  AND TABLE_NAME = 'client_config_variable' 
  56.                  AND INDEX_NAME IN ('unique_client_variable', 'idx_client_key')"
  57.             );
  58.             
  59.             foreach ($indexResult as $idx) {
  60.                 $this->addSql('DROP INDEX ' $idx['INDEX_NAME'] . ' ON client_config_variable');
  61.             }
  62.             
  63.             // Step 3: Rename column
  64.             $this->addSql('ALTER TABLE client_config_variable CHANGE clientId client_id INT NOT NULL');
  65.             
  66.             // Step 4: Recreate indexes
  67.             $this->addSql('CREATE UNIQUE INDEX unique_client_variable ON client_config_variable (client_id, variableKey)');
  68.             $this->addSql('CREATE INDEX idx_client_key ON client_config_variable (client_id, variableKey)');
  69.             
  70.             // Step 5: Recreate foreign key
  71.             $this->addSql('ALTER TABLE client_config_variable ADD CONSTRAINT FK_9C44E90819EB6921 FOREIGN KEY (client_id) REFERENCES client (id) ON DELETE CASCADE');
  72.         }
  73.         // Rename clientId to client_id in venue table
  74.         if ($this->columnExists('venue''clientId')) {
  75.             $this->addSql('ALTER TABLE venue CHANGE clientId client_id INT DEFAULT NULL');
  76.         }
  77.         // Rename clientId to client_id in course table
  78.         if ($this->columnExists('course''clientId')) {
  79.             $this->addSql('ALTER TABLE course CHANGE clientId client_id INT DEFAULT NULL');
  80.         }
  81.         // Rename clientId to client_id in course_series table
  82.         if ($this->columnExists('course_series''clientId')) {
  83.             $this->addSql('ALTER TABLE course_series CHANGE clientId client_id INT DEFAULT NULL');
  84.         }
  85.     }
  86.     public function down(Schema $schema): void
  87.     {
  88.         // Reverse: Rename client_id back to clientId
  89.         
  90.         if ($this->columnExists('client_config''client_id')) {
  91.             $this->addSql('ALTER TABLE client_config CHANGE client_id clientId INT DEFAULT NULL');
  92.         }
  93.         if ($this->columnExists('client_config_variable''client_id')) {
  94.             // Drop foreign key
  95.             $fkResult $this->connection->fetchAllAssociative(
  96.                 "SELECT CONSTRAINT_NAME 
  97.                  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  98.                  WHERE TABLE_SCHEMA = DATABASE() 
  99.                  AND TABLE_NAME = 'client_config_variable' 
  100.                  AND COLUMN_NAME = 'client_id' 
  101.                  AND REFERENCED_TABLE_NAME IS NOT NULL"
  102.             );
  103.             
  104.             foreach ($fkResult as $fk) {
  105.                 $this->addSql('ALTER TABLE client_config_variable DROP FOREIGN KEY ' $fk['CONSTRAINT_NAME']);
  106.             }
  107.             
  108.             // Drop indexes
  109.             $indexResult $this->connection->fetchAllAssociative(
  110.                 "SELECT DISTINCT INDEX_NAME 
  111.                  FROM INFORMATION_SCHEMA.STATISTICS 
  112.                  WHERE TABLE_SCHEMA = DATABASE() 
  113.                  AND TABLE_NAME = 'client_config_variable' 
  114.                  AND INDEX_NAME IN ('unique_client_variable', 'idx_client_key')"
  115.             );
  116.             
  117.             foreach ($indexResult as $idx) {
  118.                 $this->addSql('DROP INDEX ' $idx['INDEX_NAME'] . ' ON client_config_variable');
  119.             }
  120.             
  121.             // Rename column
  122.             $this->addSql('ALTER TABLE client_config_variable CHANGE client_id clientId INT NOT NULL');
  123.             
  124.             // Recreate indexes and foreign key
  125.             $this->addSql('CREATE UNIQUE INDEX unique_client_variable ON client_config_variable (clientId, variableKey)');
  126.             $this->addSql('CREATE INDEX idx_client_key ON client_config_variable (clientId, variableKey)');
  127.         }
  128.         if ($this->columnExists('venue''client_id')) {
  129.             $this->addSql('ALTER TABLE venue CHANGE client_id clientId INT DEFAULT NULL');
  130.         }
  131.         if ($this->columnExists('course''client_id')) {
  132.             $this->addSql('ALTER TABLE course CHANGE client_id clientId INT DEFAULT NULL');
  133.         }
  134.         if ($this->columnExists('course_series''client_id')) {
  135.             $this->addSql('ALTER TABLE course_series CHANGE client_id clientId INT DEFAULT NULL');
  136.         }
  137.     }
  138. }