thinkphp框架中Model对象$origin对象的作用

在Model的构造函数中,$origin的初始化方式如下

if (is_object($data)) {
      $this->data = get_object_vars($data);
} else {
      $this->data = $data;
}
// 记录原始数据
$this->origin = $this->data;

$origin保存的是一个数组,因为如果保存的是对象的话,因为对象是引用,修改的时候会把$data和$origin同时修改了。

而我们需要的效果是$origin保存初始化时候的原始数据。

在thinkphp的save函数中,就可以对比$data和$origin找出修改了哪些字段,这样更新的时候就可以只更新修改过的字段

$data = array_udiff_assoc($this->data, $this->origin, function ($a, $b) {
       if ((empty($a) || empty($b)) && $a !== $b) {
              return 1;
       }
       return is_object($a) || $a != $b ? 1 : 0;
});
时间: 2025-01-02 16:17:23

thinkphp框架中Model对象$origin对象的作用的相关文章

php学习日记1(关于Thinkphp框架中D的含义和用法)

D方法 D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D('[项目://][分组/]模型','模型层名称')方法的返回值是实例化的模型对象. D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化.D方法最常用的用法就是实例化当前项目的某个自定义模型,例如: // 实例化User模型

YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CModel实现的接口相关,接下来我们看下其实现的整个过程对于一个我们定义的model,它会继承虚类CActiveRecord,CActiveRecord类继承于CModel,如下所示: class special extends CActiveRecord { } abstract class CAct

浅析Thinkphp框架中运用phprpc扩展模式

浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc传输的数据流相对于普通WebService中的 XML或JSON形式的数据量明显减少,而且因为数据量的关系解析速度明显比较快~~ 说实话,以前还真不知道有phprpc这个协议的,本打算使用 sina的api的restlet形式开发,但自己写库的话会花比较多的时间,而现在轻量级的php框架支持rest

制作类似ThinkPHP框架中的PATHINFO模式功能(二)

距离上一次发布的<制作类似ThinkPHP框架中的PATHINFO模式功能>(文章地址:http://www.cnblogs.com/phpstudy2015-6/p/6242700.html)已经过去好多天了,今晚就将剩下的一些东西扫尾吧. 上一篇文章已经实现了PATHINFO模式的URL,即我们访问MVC模式搭建的站点时,只需要在域名后面加上(/module/controller/action)即可,很智能化.并且通过new Object时的自动触发函数实现类文件的自动载入,因此只要我们搭

thinkphp 框架中的一部分方法解析

 1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> <script src="__ROOT__/Public/js/jquery-1.11.2.min.js"></script> </head> <body> <div> 账号:<input type="text&quo

Thinkphp框架中自定义修改success和error页面

Thinkphp框架中自定义修改success和error页面 Thinkphp框架的默认success和error太难看,可以自定义设置,步骤如下: (注意:TP原框架中的success跳转有问题,先修改框架内容) 在TP的Controller.class.php中L284行下增加exit; 1.修改配置文件,增加自定义页面路径(在Admin模块下的config.php中增加) // 跳转页面模板 'TMPL_ACTION_ERROR' => MODULE_PATH.'View/Common/

thinkphp框架中“关联操作”的完整定义详解

在复杂的关联操作中,如果要给关联定义增加可选的属性,我们可以采用完整定义的方式. 完整定义的格式是: protected $_link = array( '关联表名1'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), '关联表名2'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), ... ); 在上面的格式描述中,对于属性我

ThinkPHP框架中关于查询分页显示的一个小方法

thinkphp框架是一个非常好用的框架.在日常使用中非常方便,其中包含了有分页的方法,我们用的时候往往会自定义的进行一些修改,下面是我自己修改的一个关于分页的小方法. 代码如下: function getPages($comModel,$where="",$order="",$pageSize="",$join="",$field="",$tmp="",$group="&qu

thinkphp框架中session常识

在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置SESSION_OPTIONS参数即可 认情况下,初始化之后系统会自动启动session,如果不希望系统自动启动session的话,可以设置SESSION_AUTO_START为false. 'SESSION_AUTO_START' =>false session删除 session(null);