hasTable('reviews')) { return; } $reviews = $schema->getTable('reviews'); if ($reviews->hasColumn('album_id')) { // Already migrated (common for SQLite dev DBs) return; } if ($this->connection->getDatabasePlatform()->getName() === 'sqlite') { // SQLite cannot add FK constraints after table creation; add the column + index and rely on app-level validation. $this->addSql('ALTER TABLE reviews ADD COLUMN album_id INTEGER DEFAULT NULL'); $this->addSql('CREATE INDEX IF NOT EXISTS IDX_6970EF78E0C31AF9 ON reviews (album_id)'); $this->addSql('UPDATE reviews SET album_id = (SELECT a.id FROM albums a WHERE a.spotify_id = reviews.spotify_album_id) WHERE album_id IS NULL'); return; } // Add nullable album_id first (PostgreSQL / others that support full DDL) $this->addSql('ALTER TABLE reviews ADD album_id INT DEFAULT NULL'); $this->addSql('ALTER TABLE reviews ADD CONSTRAINT FK_6970EF78E0C31AF9 FOREIGN KEY (album_id) REFERENCES albums (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('CREATE INDEX IDX_6970EF78E0C31AF9 ON reviews (album_id)'); // Backfill using existing spotify_album_id if both columns exist // Some environments may not have the legacy column; guard with DO blocks $this->addSql(<<<'SQL' DO $$ BEGIN IF EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name='reviews' AND column_name='spotify_album_id' ) THEN UPDATE reviews r SET album_id = a.id FROM albums a WHERE a.spotify_id = r.spotify_album_id AND r.album_id IS NULL; END IF; END $$; SQL); // Optionally set NOT NULL if all rows are linked $this->addSql(<<<'SQL' DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM reviews WHERE album_id IS NULL) THEN ALTER TABLE reviews ALTER COLUMN album_id SET NOT NULL; END IF; END $$; SQL); } public function down(Schema $schema): void { if (!$schema->hasTable('reviews')) { return; } $reviews = $schema->getTable('reviews'); if (!$reviews->hasColumn('album_id')) { return; } if ($this->connection->getDatabasePlatform()->getName() === 'sqlite') { $this->addSql('DROP INDEX IF EXISTS IDX_6970EF78E0C31AF9'); $this->addSql('ALTER TABLE reviews DROP COLUMN album_id'); return; } $this->addSql('ALTER TABLE reviews DROP CONSTRAINT FK_6970EF78E0C31AF9'); $this->addSql('DROP INDEX IF EXISTS IDX_6970EF78E0C31AF9'); $this->addSql('ALTER TABLE reviews DROP COLUMN album_id'); } }