ThinkPHP中_after_update、_before_update等的用法

ThinkPHP中_after_update、_before_update等的用法

https://blog.csdn.net/aslackers/article/details/50339163

TP系统\Think\Model类里隐藏了几个有用的方法:

_before_insert、_after_insert、_before_delete 、_after_delete、_before_update、_after_update、_after_select。。。。。。

但是在手册里并没有列出来,只有在源码中才能看到。新建个测试类ArticleModel.class.php

class ArticleModel extends Model {
 
    protected $article = '';
 
    public function _initialize(){
        $this->article = M('Article');
    }
 
    public function updateArt($id = 0, $data = array()){
         $this->article->where('id = ' . $id)->save($data);
    }
 
    protected function _before_update(&$data,$options) {
        $data['contents'] = 'ppppppp';
    }
 
    protected function _after_update($data,$options) {
        $this->article->add($data);
    }
}

在控制器里调用

public
function update() { $id = 1; $data['title'] = 'ttt'; D('Article')->updateArt($id,$data); }

结果发现,_before_update和_after_update都没触发,但在系统的\Think\Model类里却能触发,手册中关于M方法和D方法,发现这句:M方法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: ——————— 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

class ArticleModel extends Model {
 
    public function updateArt($id = 0, $data = array()){
         $this->where('id = ' . $id)->save($data);
    }
 
    protected function _before_update(&$data,$options) {
        $data['contents'] = 'ppppppp';
    }
 
    protected function _after_update($data,$options) {
        $this->add($data);
    }
}

 

结果发现,_before_update和_after_update都没触发,但在系统的\Think\Model类里却能触发,手册中关于M方法和D方法,发现这句:M方引用TP手册中关于M方法和D方法的介绍,总结一下:

D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复去实例化。

D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。

M方法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。

——————— 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy 法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: ——————— 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: ——————— 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112866.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月28日 下午8:00
下一篇 2021年10月28日 下午9:00


相关推荐

  • .NET中pdb文件的作用是什么「建议收藏」

    .NET中pdb文件的作用是什么「建议收藏」.PDB是ProgramDatabase的缩写,全称为“程序数据库”文件。我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序。目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在。 PDB文件寻路 如果我们观察VS启动调试加载模块和符号文件的过程,会发现它通常会从可执行文件或者DLL文件的相同目录中加载符号文件。这正是调试器寻找PDB文件的

    2022年5月5日
    117
  • java finalize方法详解

    1.finalize的作用finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性不建议用finalize方法完成“非内存资源”的清理工作…

    2022年4月5日
    894
  • linux下pycharm教育版安装汉化

    linux下pycharm教育版安装汉化1 linux 安装 pycharm 官网直接下载 linux 下的安装包 教育版好像不需要激活成功教程路径 https www jetbrains com pycharm edu download download thanks html platform linux 上传到 linux 下直接解压即可解压完毕后进入 bin 目录执行 pycharm sh 进行安装使用 以后每

    2026年3月27日
    3
  • Laravel框架数据库CURD操作、连贯操作总结

    Laravel框架数据库CURD操作、连贯操作总结

    2021年10月24日
    42
  • rabbitmq实际使用案例_沉默的螺旋案例

    rabbitmq实际使用案例_沉默的螺旋案例一.简单模式(队列–>交换机)yml配置:server:port:8088spring:rabbitmq:host:127.0.0.1port:5672username:guestpassword:guestpublisher-confirm-type:correlated#消息确认方式,通过correlated来确认(将来的消息中才会带correlation_id,只有通过correlation_

    2022年10月3日
    3
  • tomcat8安装及配置教程_vrrp配置实例

    tomcat8安装及配置教程_vrrp配置实例1.下载tomcat8,官网地址:http://tomcat.apache.org/根据自己电脑的系统,下载对应的版本zip,我下载的是window64位的zip包下一步:2.解压缩apache-tomcat-8.5.11-windows-x64.zip到D盘3.环境变量配置:(请先看文章结尾)3.1系统变量,新增 CATALINA_HOME,地址就是刚才文件夹,不需要带/bin3.2…

    2026年1月21日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号