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 = [];
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue