mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-01 13:48:37 +02:00
Merge pull request #10454 from creative-commoners/pulls/5/rescue-master-table-name
API rescue master-branch PR: Shorten auto-generated table names #7621
This commit is contained in:
commit
37ff4ee46a
@ -59,8 +59,6 @@ abstract class DBSchemaManager
|
||||
/**
|
||||
* @param string $table
|
||||
* @param string $class
|
||||
*
|
||||
* @deprecated 4.0.0:5.0.0
|
||||
*/
|
||||
public static function showTableNameWarning($table, $class)
|
||||
{
|
||||
@ -436,11 +434,10 @@ abstract class DBSchemaManager
|
||||
if (!$table_name_info_sent) {
|
||||
$this->alterationMessage(
|
||||
<<<'MESSAGE'
|
||||
<strong>Please note:</strong> It is strongly recommended to define a
|
||||
table_name for all namespaced models. Not defining a table_name may cause generated table
|
||||
names to be too long and may not be supported by your current database engine. The generated
|
||||
naming scheme will also change when upgrading to SilverStripe 5.0 and potentially break.
|
||||
MESSAGE
|
||||
<strong>Please note:</strong> It is strongly recommended to define a
|
||||
table_name for all namespaced models. Not defining a table_name may cause generated table
|
||||
names to be too long and may not be supported by your current database engine.
|
||||
MESSAGE
|
||||
,
|
||||
'error'
|
||||
);
|
||||
|
@ -3633,6 +3633,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(
|
||||
@ -3640,6 +3641,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.
|
||||
|
@ -58,9 +58,9 @@ class DataObjectSchemaTest extends SapphireTest
|
||||
'DOSTWithCustomTable',
|
||||
$schema->tableName(WithCustomTable::class)
|
||||
);
|
||||
// Default table name is FQN
|
||||
// Default table name is Vendor plus base class
|
||||
$this->assertEquals(
|
||||
'SilverStripe_ORM_Tests_DataObjectSchemaTest_DefaultTableName',
|
||||
'SilverStripe_DefaultTableName',
|
||||
$schema->tableName(DefaultTableName::class)
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user