dont update entity and dont run an update query if an entity wasnt changed at all

This commit is contained in:
Bernhard Posselt 2014-04-23 13:43:17 +02:00
parent 309aa3bcd2
commit 5199e4508a
4 changed files with 33 additions and 2 deletions

View File

@ -92,6 +92,9 @@ abstract class Entity {
protected function setter($name, $args) {
// setters should only work for existing attributes
if(property_exists($this, $name)){
if($this->$name === $args[0]) {
return;
}
$this->markFieldUpdated($name);
// if type definition exists, cast to correct type

View File

@ -127,6 +127,12 @@ abstract class Mapper {
* @param Entity $entity the entity that should be created
*/
public function update(Entity $entity){
// if entity wasn't changed it makes no sense to run a db query
$properties = $entity->getUpdatedFields();
if(count($properties) === 0) {
return $entity;
}
// entity needs an id
$id = $entity->getId();
if($id === null){
@ -136,7 +142,6 @@ abstract class Mapper {
// get updated fields to save, fields have to be set using a setter to
// be saved
$properties = $entity->getUpdatedFields();
// dont update the id field
unset($properties['id']);

View File

@ -42,8 +42,9 @@ class TestEntity extends Entity {
public $testId;
public $preName;
public function __construct(){
public function __construct($name=null){
$this->addType('testId', 'integer');
$this->name = $name;
}
};
@ -211,4 +212,12 @@ class EntityTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals('integer', gettype($entity->getId()));
}
public function testFieldsNotMarkedUpdatedIfNothingChanges() {
$entity = new TestEntity('hey');
$entity->setName('hey');
$this->assertEquals(0, count($entity->getUpdatedFields()));
}
}

View File

@ -217,6 +217,20 @@ class MapperTest extends MapperTestUtility {
}
public function testUpdateNothingChangedNoQuery(){
$params = array('john', 'my@email');
$entity = new Example();
$entity->setId(3);
$entity->setEmail($params[1]);
$entity->resetUpdatedFields();
$this->db->expects($this->never())
->method('prepareQuery');
$this->mapper->update($entity);
}
public function testMapRowToEntity(){
$entity1 = $this->mapper->mapRow(array('pre_name' => 'test1', 'email' => 'test2'));
$entity2 = new Example();