mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
ENH shorten auto-generated table names
Fix add check for legacy long table name and rename to short version
This commit is contained in:
parent
2ae52120c1
commit
156f63bce3
@ -3623,6 +3623,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
|
||||
$fields = $schema->databaseFields(static::class, false);
|
||||
$indexes = $schema->databaseIndexes(static::class, false);
|
||||
$extensions = self::database_extensions(static::class);
|
||||
$legacyTables = $schema->getLegacyTableNames(static::class);
|
||||
|
||||
if (empty($table)) {
|
||||
throw new LogicException(
|
||||
@ -3630,6 +3631,26 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
|
||||
);
|
||||
}
|
||||
|
||||
if ($legacyTables) {
|
||||
$ignore = Config::inst()->get(static::class, 'ignored_legacy_tables') ?: [];
|
||||
$renameTables = array_diff(
|
||||
array_intersect($legacyTables, DB::table_list()),
|
||||
$ignore
|
||||
);
|
||||
if (count($renameTables) > 1) {
|
||||
$class = static::class;
|
||||
$legacyList = implode(', ', $renameTables);
|
||||
trigger_error(
|
||||
"Class $class has multiple legacy tables: $legacyList",
|
||||
E_USER_NOTICE
|
||||
);
|
||||
}
|
||||
if (count($renameTables) === 1) {
|
||||
$dbSchema = DB::get_schema();
|
||||
$dbSchema->renameTable($renameTables[0], $table);
|
||||
}
|
||||
}
|
||||
|
||||
if ($fields) {
|
||||
$hasAutoIncPK = get_parent_class($this ?? '') === self::class;
|
||||
DB::require_table(
|
||||
|
@ -318,18 +318,30 @@ class DataObjectSchema
|
||||
{
|
||||
$table = Config::inst()->get($class, 'table_name', Config::UNINHERITED);
|
||||
|
||||
// Generate default table name
|
||||
// Return table name if configured
|
||||
if ($table) {
|
||||
return $table;
|
||||
}
|
||||
|
||||
// Use classname directly if not namespaced
|
||||
if (strpos($class ?? '', '\\') === false) {
|
||||
return $class;
|
||||
}
|
||||
|
||||
$separator = DataObjectSchema::config()->uninherited('table_namespace_separator');
|
||||
$table = str_replace('\\', $separator ?? '', trim($class ?? '', '\\'));
|
||||
// Attempt to generate a nice table name
|
||||
$separator = DataObjectSchema::config()->uninherited('table_namespace_separator') ?? '';
|
||||
$parts = explode('\\', trim($class ?? '', '\\'));
|
||||
$vendor = array_slice($parts, 0, 1)[0];
|
||||
$base = array_slice($parts, -1, 1)[0];
|
||||
if ($vendor && $base && $vendor !== $base) {
|
||||
$table = "{$vendor}{$separator}{$base}";
|
||||
} elseif ($base) {
|
||||
$table = $base;
|
||||
} else {
|
||||
throw new InvalidArgumentException("Unable to build a table name for class '$class'. Define a table_name for this class.");
|
||||
}
|
||||
|
||||
// Display a warning about namespaced classes producing long table names
|
||||
if (!ClassInfo::classImplements($class, TestOnly::class) && $this->classHasTable($class)) {
|
||||
DBSchemaManager::showTableNameWarning($table, $class);
|
||||
}
|
||||
@ -337,6 +349,18 @@ class DataObjectSchema
|
||||
return $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $class
|
||||
* @return array
|
||||
*/
|
||||
public function getLegacyTableNames($class)
|
||||
{
|
||||
$separator = DataObjectSchema::config()->uninherited('table_namespace_separator');
|
||||
$names[] = str_replace('\\', $separator, trim($class, '\\'));
|
||||
|
||||
return $names;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the complete map of fields to specification on this object, including fixed_fields.
|
||||
* "ID" will be included on every table.
|
||||
|
Loading…
Reference in New Issue
Block a user