Грязные методы в Rails-эквиваленте в PHP Codeignitor - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в PHP & Codeigniter, но в PHP требовалась какая-то реализация.

Ниже приведены грязные методы , предоставляемые по умолчанию в rails framework, здесь person - это объект модели, представляющий строку в таблице persons.

person.name = 'Bob'
person.changed?       # => true
person.name_changed?  # => true
person.name_changed?(from: nil, to: "Bob") # => true
person.name_was       # => nil
person.name_change    # => [nil, "Bob"]
person.name = 'Bill'
person.name_change    # => [nil, "Bill"]

Меня особенно интересует to & from, пожалуйста, подскажите, возможно ли это каким-либо образом.

1 Ответ

0 голосов
/ 28 марта 2019

Если вы рассматриваете основную структуру 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();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...