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 = []; private $data = [];
/**
* Used to limit/avoid updates if no data was changed.
*
* @var array
*/
private $originalData = [];
/** /**
* @param Database $dba * @param Database $dba
* @param LoggerInterface $logger * @param LoggerInterface $logger
@ -38,6 +45,12 @@ abstract class BaseModel
$this->dba = $dba; $this->dba = $dba;
$this->logger = $logger; $this->logger = $logger;
$this->data = $data; $this->data = $data;
$this->originalData = $data;
}
public function getOriginalData()
{
return $this->originalData;
} }
/** /**
@ -51,6 +64,7 @@ abstract class BaseModel
{ {
$model = clone $prototype; $model = clone $prototype;
$model->data = $data; $model->data = $data;
$model->originalData = $data;
return $model; return $model;
} }

View file

@ -122,7 +122,7 @@ abstract class BaseRepository extends BaseFactory
*/ */
public function update(BaseModel $model) 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); $return = $this->dba->insert(static::$table_name, $fields);
if ($return) { if (!$return) {
$fields['id'] = $this->dba->lastInsertId(); throw new HTTPException\InternalServerErrorException('Unable to insert new row in table "' . static::$table_name . '"');
$return = $this->create($fields);
} }
$fields['id'] = $this->dba->lastInsertId();
$return = $this->create($fields);
return $return; return $return;
} }

View file

@ -1342,19 +1342,13 @@ class Database
} }
} }
$do_update = (count($old_fields) == 0);
foreach ($old_fields AS $fieldname => $content) { foreach ($old_fields AS $fieldname => $content) {
if (isset($fields[$fieldname])) { if (isset($fields[$fieldname]) && !is_null($content) && ($fields[$fieldname] == $content)) {
if (($fields[$fieldname] == $content) && !is_null($content)) { unset($fields[$fieldname]);
unset($fields[$fieldname]);
} else {
$do_update = true;
}
} }
} }
if (!$do_update || (count($fields) == 0)) { if (count($fields) == 0) {
return true; return true;
} }