/** * Handle orphaned rows in intermediate many_many tables. */ public function handleBrokenManyManyRelations() { JanitorDebug::message("handleBrokenManyManyRelations()"); $dbTables = DataObjectOnDeleteDecorator::get_db_tables(); foreach ((array)$this->dataObject->many_many() as $relationName => $relationClass) { list($parentClass, $componentClass, $parentField, $componentField, $table) = $this->dataObject->many_many($relationName); if (!in_array($table, DataObjectOnDeleteDecorator_ManyManyCleaner::get_ignored_tables()) && in_array(strtolower($table), $dbTables)) { $oneWayTables = DataObjectOnDeleteDecorator_ManyManyCleaner::get_one_way_tables(); $oneWayTable = array_key_exists($table, $oneWayTables); if ($oneWayTable && $oneWayTables[$table] != $relationName) { JanitorDebug::message("Handling one-way table \"{$table}\" from \"{$relationName}\", aborting"); continue; } $query = "SELECT \"{$parentField}\" FROM \"{$table}\" WHERE 1=1"; $relations = DB::query($query)->column($parentField); foreach ((array)$relations as $ID) { $baseDataObject = DataObject::get_by_id($this->baseClassName, $ID); if ($baseDataObject) continue; $query = "DELETE FROM \"{$table}\" WHERE \"{$parentField}\" = {$ID}"; JanitorDebug::message("Running query: {$query}", 'p', 'color:#ff0000'); DB::query($query); } } } }