patchHistory = $patchHistory; $this->flagManager = $flagManager; } public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if (!$this->flagManager->getFlagData(self::FLAG_CODE)) { if ($this->removeTables($setup)) { $this->flagManager->saveFlag(self::FLAG_CODE, true); } } $setup->endSetup(); } private function removeTables(ModuleDataSetupInterface $setup): bool { $tablesToDrop = [ MigrateActiveSessionsData::OLD_TABLE_NAME => [ 'patchName' => MigrateActiveSessionsData::class, 'refTable' => '' ], MigrateLogEntryData::OLD_TABLE_NAME => [ 'patchName' => MigrateLogEntryData::class, 'refTable' => LogDetailResource::TABLE_NAME ], MigrateVisitEntryData::OLD_TABLE_NAME => [ 'patchName' => MigrateVisitEntryData::class, 'refTable' => VisitHistoryDetailResource::TABLE_NAME ] ]; $connection = $setup->getConnection(); foreach ($tablesToDrop as $table => &$info) { if ($this->patchHistory->isApplied($info['patchName'])) { $tableName = $setup->getTable($table); if ($setup->tableExists($table)) { $connection->dropTable($tableName); $this->dropForeignKeys($setup, $info['refTable'], $tableName); } unset($tablesToDrop[$table]); } } return empty($tablesToDrop); } private function dropForeignKeys(ModuleDataSetupInterface $setup, string $tableName, string $refTable) { if ($tableName && $setup->tableExists($tableName)) { $connection = $setup->getConnection(); foreach ($connection->getForeignKeys($setup->getTable($tableName)) as $keyInfo) { if ($keyInfo['REF_TABLE_NAME'] === $refTable) { $connection->dropForeignKey($keyInfo['TABLE_NAME'], $keyInfo['FK_NAME']); } } } } }