From bcf66a225392e120f4f55d09f64e1725f342fad7 Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Sat, 26 Oct 2013 13:59:15 +0200 Subject: [PATCH] Only saving properties that were marked as dirty --- Cake/ORM/Table.php | 11 ++++++- Cake/Test/TestCase/ORM/TableTest.php | 47 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Cake/ORM/Table.php b/Cake/ORM/Table.php index e43ec16aa36..c81240774cc 100644 --- a/Cake/ORM/Table.php +++ b/Cake/ORM/Table.php @@ -711,8 +711,16 @@ protected function _processSave($entity, $options) { $schema = $this->schema(); $data = array_intersect_key($data, array_flip($schema->columns())); + $keys = array_keys($data); + + foreach ($keys as $i => $property) { + if (!$entity->dirty($property)) { + unset($keys[$i], $data[$property]); + } + } + $query = $this->_buildQuery(); - $statement = $query->insert($this->table(), array_keys($data)) + $statement = $query->insert($this->table(), $keys) ->values($data) ->executeStatement(); @@ -721,6 +729,7 @@ protected function _processSave($entity, $options) { $primary = $this->primaryKey(); $id = $statement->lastInsertId($this->table(), $primary); $entity->set($primary, $id); + $entity->clean(); $success = $entity; } diff --git a/Cake/Test/TestCase/ORM/TableTest.php b/Cake/Test/TestCase/ORM/TableTest.php index c8d73b0ec3a..8dd9cd059e2 100644 --- a/Cake/Test/TestCase/ORM/TableTest.php +++ b/Cake/Test/TestCase/ORM/TableTest.php @@ -1238,4 +1238,51 @@ public function testAtomicSaveRollbackOnFailure() { $table->save($data); } +/** + * Tests that only the properties marked as dirty are actually saved + * to the database + * + * @return void + */ + public function testSaveOnlyDirtyProperties() { + $entity = new \Cake\ORM\Entity([ + 'username' => 'superuser', + 'password' => 'root', + 'created' => new \DateTime('2013-10-10 00:00'), + 'updated' => new \DateTime('2013-10-10 00:00') + ]); + $entity->clean(); + $entity->dirty('username', true); + $entity->dirty('created', true); + $entity->dirty('updated', true); + + $table = TableRegistry::get('users'); + $this->assertSame($entity, $table->save($entity)); + $this->assertEquals($entity->id, 5); + + $row = $table->find('all')->where(['id' => 5])->first(); + $entity->set('password', null); + $this->assertEquals($entity->toArray(), $row->toArray()); + } + +/** + * Tests that a recently saved entity is marked as clean + * + * @return void + */ + public function testsASavedEntityIsClean() { + $entity = new \Cake\ORM\Entity([ + 'username' => 'superuser', + 'password' => 'root', + 'created' => new \DateTime('2013-10-10 00:00'), + 'updated' => new \DateTime('2013-10-10 00:00') + ]); + $table = TableRegistry::get('users'); + $this->assertSame($entity, $table->save($entity)); + $this->assertFalse($entity->dirty('usermane')); + $this->assertFalse($entity->dirty('password')); + $this->assertFalse($entity->dirty('created')); + $this->assertFalse($entity->dirty('updated')); + } + }