diff --git a/Cake/ORM/Table.php b/Cake/ORM/Table.php index c0dff2899a3..744420d2810 100644 --- a/Cake/ORM/Table.php +++ b/Cake/ORM/Table.php @@ -775,7 +775,19 @@ protected function _insert($entity, $data) { } protected function _update($entity, $data) { + $query = $this->_buildQuery(); + $primaryKey = $entity->extract((array)$this->primaryKey()); + $statement = $query->update($this->table()) + ->set($data) + ->where($primaryKey) + ->executeStatement(); + $success = false; + if ($statement->rowCount() > 0) { + $entity->clean(); + $success = $entity; + } + return $success; } /** diff --git a/Cake/Test/TestCase/ORM/TableTest.php b/Cake/Test/TestCase/ORM/TableTest.php index 1e59fe6dcc8..d2bec2a0b1f 100644 --- a/Cake/Test/TestCase/ORM/TableTest.php +++ b/Cake/Test/TestCase/ORM/TableTest.php @@ -1342,4 +1342,26 @@ public function testsASavedEntityIsNotNew() { $this->assertFalse($entity->isNew()); } +/** + * Tests that save can detect automatically if it needs to insert + * or update a row + * + * @return void + */ + public function testSaveUpdateAuto() { + $entity = new \Cake\ORM\Entity([ + 'id' => 2, + 'username' => 'baggins' + ]); + $table = TableRegistry::get('users'); + $original = $table->find('all')->where(['id' => 2])->first(); + $this->assertSame($entity, $table->save($entity)); + $row = $table->find('all')->where(['id' => 2])->first(); + $this->assertEquals('baggins', $row->username); + $this->assertEquals($original->password, $row->password); + $this->assertEquals($original->created, $row->created); + $this->assertEquals($original->updated, $row->updated); + } + + }