37338-vm/db/migrations/015_add_group_id_to_functions.php
2026-01-10 09:20:40 +00:00

62 lines
3.0 KiB
PHP

<?php
require_once __DIR__ . '/../../db/config.php';
try {
$pdo = db();
// First, check if the column already exists
$stmt = $pdo->query("SHOW COLUMNS FROM `functions` LIKE 'bni_group_id'");
$exists = $stmt->fetch(PDO::FETCH_ASSOC);
// Check if the foreign key constraint already exists
$stmt = $pdo->query("SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'functions' AND CONSTRAINT_NAME = 'fk_functions_bni_group'");
$fk_exists = $stmt->fetch(PDO::FETCH_ASSOC);
if ($fk_exists) {
echo "Migration 015 skipped: Foreign key 'fk_functions_bni_group' already exists." . PHP_EOL;
return;
}
if (!$exists) {
// Add the bni_group_id column allowing NULLs temporarily
$pdo->exec("ALTER TABLE `functions` ADD COLUMN `bni_group_id` INT NULL AFTER `id`;");
echo "Column 'bni_group_id' added." . PHP_EOL;
}
// Find a default group to assign to existing functions
$stmt = $pdo->query("SELECT id FROM `bni_groups` ORDER BY id LIMIT 1");
$default_group = $stmt->fetch(PDO::FETCH_ASSOC);
$default_group_id = $default_group ? $default_group['id'] : null;
if ($default_group_id) {
// Update existing functions to use the default group where bni_group_id is not valid
$pdo->exec("UPDATE `functions` SET `bni_group_id` = {$default_group_id} WHERE `bni_group_id` IS NULL OR `bni_group_id` NOT IN (SELECT id FROM bni_groups)");
echo "Existing functions updated with a valid group ID." . PHP_EOL;
// Now that existing rows are updated, alter the column to be NOT NULL
$pdo->exec("ALTER TABLE `functions` MODIFY COLUMN `bni_group_id` INT NOT NULL;");
echo "Column 'bni_group_id' modified to NOT NULL." . PHP_EOL;
// Add the foreign key constraint
$pdo->exec("ALTER TABLE `functions` ADD CONSTRAINT `fk_functions_bni_group` FOREIGN KEY (`bni_group_id`) REFERENCES `bni_groups`(`id`) ON DELETE CASCADE;");
echo "Migration 015 successfully applied." . PHP_EOL;
} else {
// If there are no groups, we can't proceed if there are functions.
$stmt = $pdo->query("SELECT COUNT(*) FROM `functions`");
$function_count = $stmt->fetchColumn();
if ($function_count > 0) {
die("Migration 015 failed: Cannot create a required association to a BNI group because no BNI groups exist, but functions that need them do exist." . PHP_EOL);
} else {
// No functions exist, so we can just add the column and constraint
$pdo->exec("ALTER TABLE `functions` MODIFY COLUMN `bni_group_id` INT NOT NULL;");
$pdo->exec("ALTER TABLE `functions` ADD CONSTRAINT `fk_functions_bni_group` FOREIGN KEY (`bni_group_id`) REFERENCES `bni_groups`(`id`) ON DELETE CASCADE;");
echo "Migration 015 successfully applied (no existing functions to update)." . PHP_EOL;
}
}
} catch (PDOException $e) {
die("Migration 015 failed: " . $e->getMessage() . PHP_EOL);
}