hasTable('employee_job_sub_roles')) { $table = $this->table('employee_job_sub_roles', [ 'id' => false, 'primary_key' => ['id'], 'signed' => false, 'collation' => 'utf8mb4_general_ci', 'encoding' => 'utf8mb4', ]); $table ->addColumn('id', 'integer', [ 'identity' => true, 'signed' => false, ]) ->addColumn('employee_id', 'integer', [ 'signed' => false, 'null' => false, ]) ->addColumn('job_sub_role_id', 'integer', [ 'signed' => false, 'null' => false, ]) ->addColumn('is_primary', 'boolean', [ 'null' => false, 'default' => false, ]) ->addColumn('created_at', 'timestamp', [ 'null' => true, 'default' => 'CURRENT_TIMESTAMP', ]) ->addIndex(['employee_id', 'job_sub_role_id'], [ 'unique' => true, 'name' => 'uq_employee_subrole', ]) ->addIndex(['employee_id'], [ 'name' => 'idx_employee_job_sub_roles_employee', ]) ->addIndex(['job_sub_role_id'], [ 'name' => 'idx_employee_job_sub_roles_subrole', ]) ->addForeignKey( 'employee_id', 'employees', 'id', [ 'delete' => 'CASCADE', 'update' => 'CASCADE', 'constraint' => 'fk_employee_job_sub_roles_employee', ] ) ->addForeignKey( 'job_sub_role_id', 'job_sub_roles', 'id', [ 'delete' => 'CASCADE', 'update' => 'CASCADE', 'constraint' => 'fk_employee_job_sub_roles_subrole', ] ) ->create(); } // Import existing single sub-role assignments from employees.job_sub_role_id // into the new bridge table. $this->execute(" INSERT IGNORE INTO employee_job_sub_roles (employee_id, job_sub_role_id, is_primary, created_at) SELECT e.id, e.job_sub_role_id, 1, NOW() FROM employees e WHERE e.job_sub_role_id IS NOT NULL AND e.job_sub_role_id > 0 "); } public function down(): void { if ($this->hasTable('employee_job_sub_roles')) { $this->table('employee_job_sub_roles')->drop()->save(); } } }