diff --git a/src/BaseModel.php b/src/BaseModel.php index 055f9c4a1..5a2708914 100644 --- a/src/BaseModel.php +++ b/src/BaseModel.php @@ -28,6 +28,13 @@ abstract class BaseModel */ private $data = []; + /** + * Used to limit/avoid updates if no data was changed. + * + * @var array + */ + private $originalData = []; + /** * @param Database $dba * @param LoggerInterface $logger @@ -38,6 +45,12 @@ abstract class BaseModel $this->dba = $dba; $this->logger = $logger; $this->data = $data; + $this->originalData = $data; + } + + public function getOriginalData() + { + return $this->originalData; } /** @@ -51,6 +64,7 @@ abstract class BaseModel { $model = clone $prototype; $model->data = $data; + $model->originalData = $data; return $model; } diff --git a/src/BaseRepository.php b/src/BaseRepository.php index 9f43d8fe1..30822091e 100644 --- a/src/BaseRepository.php +++ b/src/BaseRepository.php @@ -122,7 +122,7 @@ abstract class BaseRepository extends BaseFactory */ public function update(BaseModel $model) { - return $this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], true); + return $this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData()); } /** @@ -136,11 +136,13 @@ abstract class BaseRepository extends BaseFactory { $return = $this->dba->insert(static::$table_name, $fields); - if ($return) { - $fields['id'] = $this->dba->lastInsertId(); - $return = $this->create($fields); + if (!$return) { + throw new HTTPException\InternalServerErrorException('Unable to insert new row in table "' . static::$table_name . '"'); } + $fields['id'] = $this->dba->lastInsertId(); + $return = $this->create($fields); + return $return; } diff --git a/src/Database/Database.php b/src/Database/Database.php index 8a893ab93..14e186a72 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -1342,19 +1342,13 @@ class Database } } - $do_update = (count($old_fields) == 0); - foreach ($old_fields AS $fieldname => $content) { - if (isset($fields[$fieldname])) { - if (($fields[$fieldname] == $content) && !is_null($content)) { - unset($fields[$fieldname]); - } else { - $do_update = true; - } + if (isset($fields[$fieldname]) && !is_null($content) && ($fields[$fieldname] == $content)) { + unset($fields[$fieldname]); } } - if (!$do_update || (count($fields) == 0)) { + if (count($fields) == 0) { return true; }