diff --git a/src/ORM/DataObject.php b/src/ORM/DataObject.php index dc8c2c189..682f7b150 100644 --- a/src/ORM/DataObject.php +++ b/src/ORM/DataObject.php @@ -1413,8 +1413,10 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity // Inserts done one the base table are performed in another step, so the manipulation should instead // attempt an update, as though it were a normal update. $manipulation[$table]['command'] = $isNewRecord ? 'insert' : 'update'; - $manipulation[$table]['id'] = $this->record['ID']; $manipulation[$table]['class'] = $class; + if ($this->isInDB()) { + $manipulation[$table]['id'] = $this->record['ID']; + } } /** @@ -1433,10 +1435,10 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity } // Perform an insert on the base table - $insert = new SQLInsert('"' . $baseTable . '"'); - $insert - ->assign('"Created"', $now) - ->execute(); + $manipulation = []; + $this->prepareManipulationTable($baseTable, $now, true, $manipulation, $this->baseClass()); + DB::manipulate($manipulation); + $this->changed['ID'] = self::CHANGE_VALUE; $this->record['ID'] = DB::get_generated_id($baseTable); } diff --git a/tests/php/ORM/DataObjectSchemaTest.php b/tests/php/ORM/DataObjectSchemaTest.php index da2a51d23..e8fa1cb3d 100644 --- a/tests/php/ORM/DataObjectSchemaTest.php +++ b/tests/php/ORM/DataObjectSchemaTest.php @@ -343,4 +343,35 @@ class DataObjectSchemaTest extends SapphireTest 'columns' => ['IndexedMoneyCurrency', 'IndexedMoneyAmount'] ], $indexes['IndexedMoney']); } + + /** + * Ensure that records with unique indexes can be written + */ + public function testWriteUniqueIndexes() + { + // Create default object + $zeroObject = new AllIndexes(); + $zeroObject->Number = 0; + $zeroObject->write(); + + $this->assertListEquals( + [ + ['Number' => 0], + ], + AllIndexes::get() + ); + + // Test a new record can be created without clashing with default value + $validObject = new AllIndexes(); + $validObject->Number = 1; + $validObject->write(); + + $this->assertListEquals( + [ + ['Number' => 0], + ['Number' => 1], + ], + AllIndexes::get() + ); + } } diff --git a/tests/php/ORM/DataObjectSchemaTest/AllIndexes.php b/tests/php/ORM/DataObjectSchemaTest/AllIndexes.php index ae36d951a..9c7f9b1a2 100644 --- a/tests/php/ORM/DataObjectSchemaTest/AllIndexes.php +++ b/tests/php/ORM/DataObjectSchemaTest/AllIndexes.php @@ -5,6 +5,11 @@ use SilverStripe\Dev\TestOnly; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBIndexable; +/** + * @property int $Number + * @property string $Content + * @property string $Title + */ class AllIndexes extends DataObject implements TestOnly { private static $table_name = 'DataObjectSchemaTest_AllIndexes';