当前位置: 首页 > 知识库问答 >
问题:

PHP Codeignitor中Rails等价物中的脏方法

吴才俊
2023-03-14

我是PHP新手

默认情况下,rails框架中提供了以下脏方法,这里的是模型对象,表示表中的行。

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感兴趣

共有1个答案

邹德泽
2023-03-14

如果你考虑Laravel的框架,你已经拥有了大量的功能。

Laravel雄辩的更新,只要已进行更改

它在模型中保存一个“原始”值数组,如果其中任何一个值被更改,它将把它们提交给数据库。

它们还附带了许多事件,您可以插入其中(之前保存、之后保存、之前创建、之后创建、验证规则等...),并且可以轻松扩展。这可能是我能想象到的你正在寻找的最相容的东西。

然而,这不是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();
 }
 类似资料:
  • 我是WPF技术的新手。我已经在WinForms开发了大约6年。 现在我想通过学习WPF来提高我的技能一大步。我正在阅读MSDN中的介绍指南,同时作为个人练习,我试图将WinForms UI的sructure转换为其WPF UI的等价物。 这是我想在WPF中重现的WinForms控件结构的简单模型: 我的问题:有人可以指导我或给我一个简短的例子,我如何可以添加一个下拉按钮的东西在工具栏?。

  • 我尝试使用以下R语句,并使用NumPy将其转换为Python: 有与which()等价的Python吗?这里,x是矩阵tmp中的行,k对应于另一个矩阵中的列数。 之前,我尝试了以下Python代码,并收到一个值错误(操作数无法与形状一起广播):

  • 在Gatling scala中是否有与以下代码相当的java代码?特别是wsAwait类: 这来自使用依赖关系gatling-http-2.3.1的scala项目示例。我和jar在io包中看到了。加特林。http。检查async特性AsyncCheckSupport扩展了AsyncCheckDSL。但这并没有包含在gatling-http-3.7.3中。jar在我的java测试项目中使用。 在最新

  • 我无法设置任何内容:或其他内容,包括和。是否可以从主机访问名称和?似乎无法设置中的变量...请帮我确定我遗漏了什么,提前谢谢

  • 当按要求指定初始表单字段时,我将它们设置为红色,而css是 我只想在vanilla JavaScript中触及它们时突出显示它们。

  • 我已经习惯了。NET和LINQtoEntities,尤其是IQueryable部分,它允许在获取结果之前通过不同的函数传递请求。 spring数据中是否存在类似的内容?或者其他java ORM?