<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Rename clientId columns to client_id for consistency.
* Ensures all client foreign key columns follow snake_case naming convention.
*/
final class Version20251022100100 extends AbstractMigration
{
public function getDescription(): string
{
return 'Rename clientId to client_id for naming consistency';
}
private function columnExists(string $table, string $column): bool
{
$result = $this->connection->fetchOne(
"SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = ?
AND COLUMN_NAME = ?",
[$table, $column]
);
return $result > 0;
}
public function up(Schema $schema): void
{
// Rename clientId to client_id in client_config table
if ($this->columnExists('client_config', 'clientId')) {
$this->addSql('ALTER TABLE client_config CHANGE clientId client_id INT DEFAULT NULL');
}
// Rename clientId to client_id in client_config_variable table
if ($this->columnExists('client_config_variable', 'clientId')) {
// Step 1: Find and drop existing foreign key
$fkResult = $this->connection->fetchAllAssociative(
"SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'client_config_variable'
AND COLUMN_NAME = 'clientId'
AND REFERENCED_TABLE_NAME IS NOT NULL"
);
foreach ($fkResult as $fk) {
$this->addSql('ALTER TABLE client_config_variable DROP FOREIGN KEY ' . $fk['CONSTRAINT_NAME']);
}
// Step 2: Drop indexes (only if they exist)
$indexResult = $this->connection->fetchAllAssociative(
"SELECT DISTINCT INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'client_config_variable'
AND INDEX_NAME IN ('unique_client_variable', 'idx_client_key')"
);
foreach ($indexResult as $idx) {
$this->addSql('DROP INDEX ' . $idx['INDEX_NAME'] . ' ON client_config_variable');
}
// Step 3: Rename column
$this->addSql('ALTER TABLE client_config_variable CHANGE clientId client_id INT NOT NULL');
// Step 4: Recreate indexes
$this->addSql('CREATE UNIQUE INDEX unique_client_variable ON client_config_variable (client_id, variableKey)');
$this->addSql('CREATE INDEX idx_client_key ON client_config_variable (client_id, variableKey)');
// Step 5: Recreate foreign key
$this->addSql('ALTER TABLE client_config_variable ADD CONSTRAINT FK_9C44E90819EB6921 FOREIGN KEY (client_id) REFERENCES client (id) ON DELETE CASCADE');
}
// Rename clientId to client_id in venue table
if ($this->columnExists('venue', 'clientId')) {
$this->addSql('ALTER TABLE venue CHANGE clientId client_id INT DEFAULT NULL');
}
// Rename clientId to client_id in course table
if ($this->columnExists('course', 'clientId')) {
$this->addSql('ALTER TABLE course CHANGE clientId client_id INT DEFAULT NULL');
}
// Rename clientId to client_id in course_series table
if ($this->columnExists('course_series', 'clientId')) {
$this->addSql('ALTER TABLE course_series CHANGE clientId client_id INT DEFAULT NULL');
}
}
public function down(Schema $schema): void
{
// Reverse: Rename client_id back to clientId
if ($this->columnExists('client_config', 'client_id')) {
$this->addSql('ALTER TABLE client_config CHANGE client_id clientId INT DEFAULT NULL');
}
if ($this->columnExists('client_config_variable', 'client_id')) {
// Drop foreign key
$fkResult = $this->connection->fetchAllAssociative(
"SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'client_config_variable'
AND COLUMN_NAME = 'client_id'
AND REFERENCED_TABLE_NAME IS NOT NULL"
);
foreach ($fkResult as $fk) {
$this->addSql('ALTER TABLE client_config_variable DROP FOREIGN KEY ' . $fk['CONSTRAINT_NAME']);
}
// Drop indexes
$indexResult = $this->connection->fetchAllAssociative(
"SELECT DISTINCT INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'client_config_variable'
AND INDEX_NAME IN ('unique_client_variable', 'idx_client_key')"
);
foreach ($indexResult as $idx) {
$this->addSql('DROP INDEX ' . $idx['INDEX_NAME'] . ' ON client_config_variable');
}
// Rename column
$this->addSql('ALTER TABLE client_config_variable CHANGE client_id clientId INT NOT NULL');
// Recreate indexes and foreign key
$this->addSql('CREATE UNIQUE INDEX unique_client_variable ON client_config_variable (clientId, variableKey)');
$this->addSql('CREATE INDEX idx_client_key ON client_config_variable (clientId, variableKey)');
}
if ($this->columnExists('venue', 'client_id')) {
$this->addSql('ALTER TABLE venue CHANGE client_id clientId INT DEFAULT NULL');
}
if ($this->columnExists('course', 'client_id')) {
$this->addSql('ALTER TABLE course CHANGE client_id clientId INT DEFAULT NULL');
}
if ($this->columnExists('course_series', 'client_id')) {
$this->addSql('ALTER TABLE course_series CHANGE client_id clientId INT DEFAULT NULL');
}
}
}