From d96b4be9e0fff00601095a10af88bd42318f63ad Mon Sep 17 00:00:00 2001 From: solocla Date: Fri, 5 Jun 2026 14:53:34 +0200 Subject: [PATCH] fixed add sub roles --- ...60603183520_create_job_sub_roles_table.php | 170 ++++++++++-------- ...add_job_sub_role_id_to_employees_table.php | 113 +++++++++--- 2 files changed, 186 insertions(+), 97 deletions(-) diff --git a/db/migrations/20260603183520_create_job_sub_roles_table.php b/db/migrations/20260603183520_create_job_sub_roles_table.php index 357f833..b1d85ed 100644 --- a/db/migrations/20260603183520_create_job_sub_roles_table.php +++ b/db/migrations/20260603183520_create_job_sub_roles_table.php @@ -4,101 +4,121 @@ declare(strict_types=1); use Phinx\Migration\AbstractMigration; -final class AddJobSubRoleIdToEmployeesTable extends AbstractMigration +final class CreateJobSubRolesTable extends AbstractMigration { - public function up(): void + public function change(): void { - if (!$this->hasTable('employees')) { - throw new RuntimeException('Table employees does not exist.'); + if (!$this->hasTable('job_roles')) { + $rolesTable = $this->table('job_roles', [ + 'id' => false, + 'primary_key' => ['id'], + 'collation' => 'utf8mb4_unicode_ci', + 'encoding' => 'utf8mb4', + ]); + + $rolesTable + ->addColumn('id', 'integer', [ + 'identity' => true, + 'signed' => false, + ]) + ->addColumn('name', 'string', [ + 'limit' => 255, + 'null' => false, + ]) + ->addColumn('description', 'text', [ + 'null' => true, + 'default' => null, + ]) + ->addColumn('sort_order', 'integer', [ + 'signed' => false, + 'null' => false, + 'default' => 999, + ]) + ->addColumn('is_active', 'boolean', [ + 'null' => false, + 'default' => 1, + ]) + ->addColumn('created_at', 'timestamp', [ + 'null' => true, + 'default' => 'CURRENT_TIMESTAMP', + ]) + ->addColumn('updated_at', 'timestamp', [ + 'null' => true, + 'default' => 'CURRENT_TIMESTAMP', + 'update' => 'CURRENT_TIMESTAMP', + ]) + ->addIndex(['is_active'], [ + 'name' => 'idx_job_roles_is_active', + ]) + ->addIndex(['sort_order'], [ + 'name' => 'idx_job_roles_sort_order', + ]) + ->create(); } - $table = $this->table('employees'); + if (!$this->hasTable('job_sub_roles')) { + $table = $this->table('job_sub_roles', [ + 'id' => false, + 'primary_key' => ['id'], + 'collation' => 'utf8mb4_unicode_ci', + 'encoding' => 'utf8mb4', + ]); - if (!$table->hasColumn('job_role_id')) { $table + ->addColumn('id', 'integer', [ + 'identity' => true, + 'signed' => false, + ]) ->addColumn('job_role_id', 'integer', [ 'signed' => false, + 'null' => false, + ]) + ->addColumn('name', 'string', [ + 'limit' => 255, + 'null' => false, + ]) + ->addColumn('description', 'text', [ 'null' => true, - 'after' => 'department_id', + 'default' => null, + ]) + ->addColumn('sort_order', 'integer', [ + 'signed' => false, + 'null' => false, + 'default' => 999, + ]) + ->addColumn('is_active', 'boolean', [ + 'null' => false, + 'default' => 1, + ]) + ->addColumn('created_at', 'timestamp', [ + 'null' => true, + 'default' => 'CURRENT_TIMESTAMP', + ]) + ->addColumn('updated_at', 'timestamp', [ + 'null' => true, + 'default' => 'CURRENT_TIMESTAMP', + 'update' => 'CURRENT_TIMESTAMP', ]) ->addIndex(['job_role_id'], [ - 'name' => 'idx_employees_job_role_id', + 'name' => 'idx_job_sub_roles_job_role_id', + ]) + ->addIndex(['is_active'], [ + 'name' => 'idx_job_sub_roles_is_active', + ]) + ->addIndex(['sort_order'], [ + 'name' => 'idx_job_sub_roles_sort_order', ]) ->addForeignKey( 'job_role_id', 'job_roles', 'id', [ - 'delete' => 'SET_NULL', + 'delete' => 'CASCADE', 'update' => 'CASCADE', - 'constraint' => 'fk_employees_job_role', + 'constraint' => 'fk_job_sub_roles_job_role', ] ) - ->update(); - } - - $table = $this->table('employees'); - - if (!$table->hasColumn('job_sub_role_id')) { - $afterColumn = $table->hasColumn('job_role_id') ? 'job_role_id' : 'department_id'; - - $table - ->addColumn('job_sub_role_id', 'integer', [ - 'signed' => false, - 'null' => true, - 'after' => $afterColumn, - ]) - ->addIndex(['job_sub_role_id'], [ - 'name' => 'idx_employees_job_sub_role_id', - ]) - ->addForeignKey( - 'job_sub_role_id', - 'job_sub_roles', - 'id', - [ - 'delete' => 'SET_NULL', - 'update' => 'CASCADE', - 'constraint' => 'fk_employees_job_sub_role', - ] - ) - ->update(); - } - } - - public function down(): void - { - if (!$this->hasTable('employees')) { - return; - } - - $table = $this->table('employees'); - - if ($table->hasForeignKey('job_sub_role_id')) { - $table->dropForeignKey('job_sub_role_id')->update(); - } - - if ($table->hasForeignKey('job_role_id')) { - $table->dropForeignKey('job_role_id')->update(); - } - - $table = $this->table('employees'); - - if ($table->hasIndexByName('idx_employees_job_sub_role_id')) { - $table->removeIndexByName('idx_employees_job_sub_role_id')->update(); - } - - if ($table->hasIndexByName('idx_employees_job_role_id')) { - $table->removeIndexByName('idx_employees_job_role_id')->update(); - } - - $table = $this->table('employees'); - - if ($table->hasColumn('job_sub_role_id')) { - $table->removeColumn('job_sub_role_id')->update(); - } - - if ($table->hasColumn('job_role_id')) { - $table->removeColumn('job_role_id')->update(); + ->create(); } } } diff --git a/db/migrations/20260604091640_add_job_sub_role_id_to_employees_table.php b/db/migrations/20260604091640_add_job_sub_role_id_to_employees_table.php index 1797833..357f833 100644 --- a/db/migrations/20260604091640_add_job_sub_role_id_to_employees_table.php +++ b/db/migrations/20260604091640_add_job_sub_role_id_to_employees_table.php @@ -6,30 +6,99 @@ use Phinx\Migration\AbstractMigration; final class AddJobSubRoleIdToEmployeesTable extends AbstractMigration { - public function change(): void + public function up(): void { + if (!$this->hasTable('employees')) { + throw new RuntimeException('Table employees does not exist.'); + } + $table = $this->table('employees'); - $table - ->addColumn('job_sub_role_id', 'integer', [ - 'signed' => false, - 'null' => true, - 'default' => null, - 'after' => 'job_role_id', - ]) - ->addIndex(['job_sub_role_id'], [ - 'name' => 'idx_employees_job_sub_role_id', - ]) - ->addForeignKey( - 'job_sub_role_id', - 'job_sub_roles', - 'id', - [ - 'delete' => 'SET_NULL', - 'update' => 'CASCADE', - 'constraint' => 'fk_employees_job_sub_role', - ] - ) - ->update(); + if (!$table->hasColumn('job_role_id')) { + $table + ->addColumn('job_role_id', 'integer', [ + 'signed' => false, + 'null' => true, + 'after' => 'department_id', + ]) + ->addIndex(['job_role_id'], [ + 'name' => 'idx_employees_job_role_id', + ]) + ->addForeignKey( + 'job_role_id', + 'job_roles', + 'id', + [ + 'delete' => 'SET_NULL', + 'update' => 'CASCADE', + 'constraint' => 'fk_employees_job_role', + ] + ) + ->update(); + } + + $table = $this->table('employees'); + + if (!$table->hasColumn('job_sub_role_id')) { + $afterColumn = $table->hasColumn('job_role_id') ? 'job_role_id' : 'department_id'; + + $table + ->addColumn('job_sub_role_id', 'integer', [ + 'signed' => false, + 'null' => true, + 'after' => $afterColumn, + ]) + ->addIndex(['job_sub_role_id'], [ + 'name' => 'idx_employees_job_sub_role_id', + ]) + ->addForeignKey( + 'job_sub_role_id', + 'job_sub_roles', + 'id', + [ + 'delete' => 'SET_NULL', + 'update' => 'CASCADE', + 'constraint' => 'fk_employees_job_sub_role', + ] + ) + ->update(); + } + } + + public function down(): void + { + if (!$this->hasTable('employees')) { + return; + } + + $table = $this->table('employees'); + + if ($table->hasForeignKey('job_sub_role_id')) { + $table->dropForeignKey('job_sub_role_id')->update(); + } + + if ($table->hasForeignKey('job_role_id')) { + $table->dropForeignKey('job_role_id')->update(); + } + + $table = $this->table('employees'); + + if ($table->hasIndexByName('idx_employees_job_sub_role_id')) { + $table->removeIndexByName('idx_employees_job_sub_role_id')->update(); + } + + if ($table->hasIndexByName('idx_employees_job_role_id')) { + $table->removeIndexByName('idx_employees_job_role_id')->update(); + } + + $table = $this->table('employees'); + + if ($table->hasColumn('job_sub_role_id')) { + $table->removeColumn('job_sub_role_id')->update(); + } + + if ($table->hasColumn('job_role_id')) { + $table->removeColumn('job_role_id')->update(); + } } }