Enable Model lazy updating based on only the changed data
- Simplify update decision in Database
This commit is contained in:
parent
f0474c07ce
commit
559879f41f
3 changed files with 23 additions and 13 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,10 +136,12 @@ abstract class BaseRepository extends BaseFactory
|
|||
{
|
||||
$return = $this->dba->insert(static::$table_name, $fields);
|
||||
|
||||
if ($return) {
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
if (isset($fields[$fieldname]) && !is_null($content) && ($fields[$fieldname] == $content)) {
|
||||
unset($fields[$fieldname]);
|
||||
} else {
|
||||
$do_update = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$do_update || (count($fields) == 0)) {
|
||||
if (count($fields) == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue