Если вы рассматриваете основную структуру Laravel, у вас уже есть большая часть этой функциональности.
Обновление Laravel Eloquent, только если были внесены изменения
Он содержитмассив «исходных» значений в модели, и если какое-либо из них было изменено, он зафиксирует их в базе данных.
Они также включают множество событий, к которым можно подключиться (beforeSave, afterSave,beforeCreate, afterCreate, правила проверки и т. д.), и они могут быть легко расширены.Это может быть ближайшая совместимая вещь, которую я могу себе представить, что вы ищете.
Это, однако, не codeigniter, он опирается на другую структуру.Если вы не настроены на Codeigniter, вы можете рассмотреть возможность перехода на платформу, такую как Laravel или OctoberCMS, в зависимости от ваших потребностей.
Редактировать, потому что вы застряли с codeigniter
Возможно, вы захотите использовать библиотеку, подобную этой: https://github.com/yidas/codeigniter-model
Это очень легко расширить с помощью некоторых пользовательских механизмов кэширования.
Приведенный ниже код можно использовать какоснова для вашей собственной реализации модели.
Она имеет очень элементарную логическую основу, но позволяет проверять состояние «грязного» и откатывать любые изменения, внесенные в модель.
Обратите внимание, что этоочень рудиментарно, и может даже содержать несколько ошибок, потому что я не запускал этот код.это больше подтверждение концепции, которая поможет вам создать модель, которая соответствует вашим потребностям.
class User extends CI_Model
{
public $table = 'users';
public $primaryKey = 'id';
public $attributes;
public $original;
public $dirty = [];
public $exists = false;
function __construct()
{
parent::Model();
}
public static function find($model_id)
{
$static = new static;
$query = $static->db->query("SELECT * FROM ' . $static->getTable() . ' WHERE ' . $this->getKeyName() . ' = ?", [$model_id]);
if($result->num_rows()) {
$static->fill($query->row_array());
$static->exists = true;
}
else {
return null;
}
return $static;
}
public function getKeyName()
{
return $this->primaryKey;
}
public function getKey()
{
return $this->getAttribute($this->getKeyName());
}
public function getTable()
{
return $this->table;
}
public function fill($attributes)
{
if(is_null($this->original)) {
$this->original = $attributes;
$this->dirty = $attributes;
}
else {
foreach($attributes as $key => $value) {
if($this->original[$key] != $value) {
$this->dirty[$key] = $value;
}
}
}
$this->attributes = $attributes;
}
public function reset()
{
$this->dirty = [];
$this->attributes = $this->original;
}
public function getAttribute($attribute_name)
{
return array_key_exists($attribute_name, $this->attributes) ? $this->attributes[$attribute_name] : null;
}
public function __get($key)
{
return $this->getAttribute($key);
}
public function __set($key, $value)
{
$this->setAttribute($key, $value);
}
public function setAttribute($key, $value)
{
if(array_key_exists($key, $this->original)) {
if($this->original[$key] !== $value) {
$this->dirty[$key] = $value;
}
}
else {
$this->original[$key] = $value;
$this->dirty[$key] = $value;
}
$this->attributes[$key] = $value;
}
public function getDirty()
{
return $this->dirty;
}
public function isDirty()
{
return (bool)count($this->dirty);
}
public function save()
{
if($this->isDirty()) {
if($this->exists)
{
$this->db->where($this->getKeyName(), $this->getKey());
$this->db->update($this->getTable(), $this->getDirty());
$this->dirty = [];
$this->original = $this->attributes;
}
else
{
$this->db->insert($this->getTable(), $this->getDirty());
$this->dirty = [];
$this->original = $this->attributes;
$this->attributes[$this->getKeyName()] = $this->db->insert_id();
$this->original[$this->getKeyName()] = $this->getKey();
$this->exists = true;
}
}
}
}
if($user = User::find(1)) {
$user->name = "Johnny Bravo";
$user->save();
}