diff --git a/src/ORM/Connect/TableBuilder.php b/src/ORM/Connect/TableBuilder.php
new file mode 100644
index 00000000000..3b3333a5e7a
--- /dev/null
+++ b/src/ORM/Connect/TableBuilder.php
@@ -0,0 +1,69 @@
+schemaUpdate(function () use ($dataClasses, $extraDataObjects, $testMode, $quiet, $showRecordCounts) {
+ $dataObjectSchema = DataObject::getSchema();
+
+ foreach ($dataClasses as $dataClass) {
+ // Check if class exists before trying to instantiate - this sidesteps any manifest weirdness
+ if (!class_exists($dataClass)) {
+ continue;
+ }
+
+ // Check if this class should be excluded as per testing conventions
+ /** @var DataObject $SNG */
+ $SNG = new $dataClass([], DataObject::CREATE_SINGLETON);
+ if (!$testMode && $SNG instanceof TestOnly) {
+ continue;
+ }
+
+ // Log data
+ if (!$quiet) {
+ $tableName = $dataObjectSchema->tableName($dataClass);
+ if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) {
+ try {
+ $count = DB::query("SELECT COUNT(*) FROM \"$tableName\"")->value();
+ $countSuffix = " ($count records)";
+ } catch (\Exception $e) {
+ $countSuffix = " (error getting record count)";
+ }
+ } else {
+ $countSuffix = "";
+ }
+
+ if (Director::is_cli()) {
+ echo " * $tableName$countSuffix\n";
+ } else {
+ echo "
$tableName$countSuffix\n";
+ }
+ }
+
+ // Instruct the class to apply its schema to the database
+ $SNG->requireTable();
+
+ // If we have additional dataobjects which need schema (i.e. for tests), do so here:
+ if ($extraDataObjects) {
+ foreach ($extraDataObjects as $dataClass) {
+ $SNG = new $dataClass([], DataObject::CREATE_SINGLETON);
+ if ($SNG instanceof DataObject) {
+ $SNG->requireTable();
+ }
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/src/ORM/Connect/TempDatabase.php b/src/ORM/Connect/TempDatabase.php
index a268adf8943..ced43d8469d 100644
--- a/src/ORM/Connect/TempDatabase.php
+++ b/src/ORM/Connect/TempDatabase.php
@@ -244,29 +244,9 @@ protected function rebuildTables($extraDataObjects = [])
$schema = $this->getConn()->getSchemaManager();
$schema->quiet();
- $schema->schemaUpdate(
- function () use ($dataClasses, $extraDataObjects) {
- foreach ($dataClasses as $dataClass) {
- // Check if class exists before trying to instantiate - this sidesteps any manifest weirdness
- if (class_exists($dataClass ?? '')) {
- $SNG = singleton($dataClass);
- if (!($SNG instanceof TestOnly)) {
- $SNG->requireTable();
- }
- }
- }
- // If we have additional dataobjects which need schema, do so here:
- if ($extraDataObjects) {
- foreach ($extraDataObjects as $dataClass) {
- $SNG = singleton($dataClass);
- if (singleton($dataClass) instanceof DataObject) {
- $SNG->requireTable();
- }
- }
- }
- }
- );
+ $tableBuilder = TableBuilder::singleton();
+ $tableBuilder->buildTables($schema, $dataClasses, $extraDataObjects, true);
Config::modify()->set(DBSchemaManager::class, 'check_and_repair_on_build', $oldCheckAndRepairOnBuild);
diff --git a/src/ORM/DatabaseAdmin.php b/src/ORM/DatabaseAdmin.php
index 30ca53b2520..c10ef679b45 100644
--- a/src/ORM/DatabaseAdmin.php
+++ b/src/ORM/DatabaseAdmin.php
@@ -14,6 +14,7 @@
use SilverStripe\Dev\DevelopmentAdmin;
use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\Connect\DatabaseException;
+use SilverStripe\ORM\Connect\TableBuilder;
use SilverStripe\ORM\FieldType\DBClassName;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
@@ -304,46 +305,8 @@ public function doBuild($quiet = false, $populate = true, $testMode = false)
// Initiate schema update
$dbSchema = DB::get_schema();
- $dbSchema->schemaUpdate(function () use ($dataClasses, $testMode, $quiet, $showRecordCounts) {
- $dataObjectSchema = DataObject::getSchema();
-
- foreach ($dataClasses as $dataClass) {
- // Check if class exists before trying to instantiate - this sidesteps any manifest weirdness
- if (!class_exists($dataClass ?? '')) {
- continue;
- }
-
- // Check if this class should be excluded as per testing conventions
- $SNG = new $dataClass([], DataObject::CREATE_SINGLETON);
- if (!$testMode && $SNG instanceof TestOnly) {
- continue;
- }
- $tableName = $dataObjectSchema->tableName($dataClass);
-
- // Log data
- if (!$quiet) {
- if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) {
- try {
- $count = DB::query("SELECT COUNT(*) FROM \"$tableName\"")->value();
- $countSuffix = " ($count records)";
- } catch (Exception $e) {
- $countSuffix = " (error getting record count)";
- }
- } else {
- $countSuffix = "";
- }
-
- if (Director::is_cli()) {
- echo " * $tableName$countSuffix\n";
- } else {
- echo "$tableName$countSuffix\n";
- }
- }
-
- // Instruct the class to apply its schema to the database
- $SNG->requireTable();
- }
- });
+ $tableBuilder = TableBuilder::singleton();
+ $tableBuilder->buildTables($dbSchema, $dataClasses, [], $quiet, $testMode, $showRecordCounts);
ClassInfo::reset_db_cache();
if (!$quiet && !Director::is_cli()) {