Enable Model lazy updating based on only the changed data

- Simplify update decision in Database
This commit is contained in:
Hypolite Petovan 2020-01-13 21:58:19 -05:00
parent f0474c07ce
commit 559879f41f
3 changed files with 23 additions and 13 deletions

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}