写在前面

这周开始学习ThinkPHP,将学习的日记记录下来。不仅仅学习怎么用TP,也要从源码上来学习TP框架。

日记每天都写,但不一定都放到网上。希望自己能够坚持下去。

闲话少说,既然是阅读源码,关于TP的建立,配置等一系列操作就不去说了,官方文档有佷详细的介绍。

要同学想要学习TP的可以点击 ThinkPHP3.2.3快速入门 学习,大家一起进步。

CURD操作

什么是CURD操作?

实际上是对数据库增删改查的简称。

包括了create、update、read、delete四个基本操作。

在TP中对CURD操作的实现是add,save,select,update。

打开Think/Library/Model.class.php,可以在其中找到这四个操作。

接下来就开始来查看源码,知道运行的流程,才能够更好的运用这四个操作。

CUED操作之add方法

add方法用于数据添加,是TP对create操作的实现。

注意一点的是,TPModel中也有create方法,但并不是CURD操作的一种,而是对即将插入数据库的数据的处理方法。

参数分析

add方法有三个参数(不必须传递),如下

$data 默认值'' 需要进行插入数据库的数据

$option 默认值array() 表达式参数 其中存储着 所有进行过的连贯操作

$replace 默认值false 是否在插入数据库时进行replace操作

返回值可能是bool(false)或数据库受影响的行数或主键值。

从返回值看出该操作是必须位于连贯操作的末尾,可以看成一连套组合技中的终结技。

流程分析

我对add方法的执行流程分成了四步

首先,检测数据是否为空

其次,进行数据处理与表达式分析

以上都通过 进行数据插入 返回插入结果

对返回的结果进行分析

步骤一

假设进行用户注册操作,插入数据表User,使用add方法进行操作。

user字段为:

主键 user_id

昵称 user_name

密码 password

邮箱 email

前台POST数据:

array(

'user_name' => 'xiamsahfw',

'password' => 'adhe99211' ,

'confrim' => 'adhe99211' ,

'email' => '221131@qq.com',

'hid' => 'register'

);

在UserController类中的操作:

$data = I('post.');

$User = M('User');

$User->create($data);

$User->add();

在add操作中,并没有给add传递任何参数,但在$User->create($data)中传递了该值,在该操作中就会自动将数据添加到Model中的$this->data中,而add会自动引用该值。

同时create方法会将自动将传递的参数与数据表的字段进行对比,将不属于表中的字段删除。

步骤二

之后,add方法就会调用_facade方法对$data进行数据处理,其实在这里是二次处理$data数据,因为在create方法以及对数据进行过处理。如果在UserController中并没有调用create方法,而是直接传递$data到add方法,那么_facade就会把'confrim' => 'adhe99211' ,'hid' => 'register'删除,变成:

array(

'user_name' => 'xiamsahfw',

'password' => 'adhe99211' ,

'email' => '221131@qq.com'

);

为了可能的连贯操作,add会调用_parseOptions进行表达式分析。

在表达式分析后即使没进行任何连贯操作,在返回的值也存在两个元素:

Array (

[table] => user

[model] => User

)

table表示操作的数据表,model表示操作的模型名。

如果之前存在连贯操作,如where,group by等也会在该项显示。此外,传递连贯操作到add方法,也会和已经存在的操作进行合并。

步骤三

以上其实都是数据插入的准备工作,准备工作完成就能够进行数据插入了。当然数据插入不属于Model的功能,在TP中需要调用Think\Driver.class.php中的insert方法。

insert方法接受三个参数

$data

$option

$replace

前两个参数是处理过的数据以及组合后的连贯操作表达式,第三个参数表示在插入数据库时,是否进行replace操作,默认为false。在这个方法中会将传递的数据与连贯操作表达式进行组合,形成正式的sql语句,并执行sql语句。最后返回执行结果。

步骤四

虽然得到了返回结果,add并不是直接将结果返回,而是返回分析后的结论。insert返回的结果,可能有:

失败 => false

成功 => 返回受影响的行数

但是实际进行中,我们可能会不仅想要得到一个插入成功的结论,而是想要得到插入后的主键值。在add方法中会对返回结果进行判断,从而返回受影响的行数(多条数据插入)或主键值(一条数据)或false。

题外话:

在进行数据插入之前我注意到有这么一行代码。

if(false === $this->_before_insert($data,$options)) {

return false;

}

这里TP没有做任何注释,寻找之后,发现是一个空方法,解释为 插入数据前的回调方法

// 插入数据前的回调方法

protected function _before_insert(&$data,$options) {}

将这个方法打印出来,结果为NULL

var_dump($this->_before_insert($data,$options)); // NULL

百度一下也没找到想要的答案,我对TP的官方文档并没有看完,可能官方会有用法的介绍。

这里很纠结,我猜测是在子类继承时,可以实现这个方法进行某些特殊操作(很大可能)。与之相同的还有_after_insert方法。

总结

写了一大串,也不知道写的是不是很清晰,但是我的确是对这个方法熟悉了很多。这个方法虽然可以不传递参数,但如果之前没进行create还是会出错的,虽然内部集成了数据处理,但不是很完善,比如对数据没能进行转义,也不能够对数据字段进行验证,需要我们自己进行调用其它方法等等。知道了add的运行原理,自然能够很好的运用它,同时对自己封装模型类时也有了很大启发。

今天就写到这儿,下一篇准备写CURD中的read,也就是TP中的select。

博主大三狗,正在努力学习中,文中有错漏之处难免,欢迎指正,欢迎批评。

php 中curd表达啥,ThinkPHP学习之CURD操作(一)相关推荐

  1. curd日志记录php,ThinkPHP学习之CURD操作(一)

    写在前面 这周开始学习ThinkPHP,将学习的日记记录下来.不仅仅学习怎么用TP,也要从源码上来学习TP框架. 日记每天都写,但不一定都放到网上.希望自己能够坚持下去. 闲话少说,既然是阅读源码,关 ...

  2. php 中curd表达啥,thinkphp的CURD和查询方式介绍

    对数据的读取 Read $m=new Model('User'); $m=M('User'); select $m->select();//获取所有数据,以数组形式返回 find $m-> ...

  3. 中望CAD机械版学习-1-基础操作

    一.页面设置 1. 需关闭微软默认中文输入法 可以自己下载一个搜狗输入法 2. 设置页面, 右击工具栏设置 3. 做模板文件设置一次就可以调用相同的样式 粗实线是细实线的两倍 0.25/0.5mm 将 ...

  4. ISME:污水厂抗性组受细菌组成和基因交换驱动且出水中抗性表达活跃

    污水厂抗性组受细菌组成和基因交换驱动且出水中抗性表达活跃 原英文标题:Wastewater treatment plant resistomes are shaped by bacterial com ...

  5. ISME:污水厂抗性组受细菌组成和基因交换驱动且出水中抗性表达活跃(一作解读)

    文章目录 污水厂抗性组受细菌组成和基因交换驱动且出水中抗性表达活跃 摘要 研究方法简介 图1 典型城镇二级活性污泥污水处理厂示意图 Ta=(Ts×Pa)/Ps 表S1 定量宏基因组和宏转录组学指标及其 ...

  6. 如何查找基因在发表研究中的表达

    点击上方蓝色「宏基因组」关注我们!专业干货每日推送! 还在为不会分析大数据发愁吗? 还在为无法查询和比较发表文章中感兴趣基因表达值抱怨吗? 使用genevestigator,高效利用已经有研究结果,轻 ...

  7. NLP中的自监督表示学习,全是动图,很过瘾的

    作者:amitness 编译:ronghuaiyang 原文链接: NLP中的自监督表示学习,全是动图,很过瘾的​mp.weixin.qq.com 其实在自监督学习的概念提出之前,NLP中就已经运用到 ...

  8. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  9. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

最新文章

  1. php开发面试题---php面向对象详解(对象的主要三个特性)
  2. 软件开发经验总结(五)读源代码的艺术
  3. python2转python3代码_python2代码批量转为python3代码
  4. Navicat连接成功忘记密码-查看密码
  5. JavaScript基础学习(七)—BOM
  6. 一加9R国行版即将到来:搭载骁龙870 售价预计3K内
  7. nosetest忽略执行指定文件方法
  8. 深入浅出数据分析:最优化-用Excel求解一个线性规划问题
  9. m苹果放n篮子_M个相同苹果放到N个相同篮子里有多少种放法
  10. java 坑爹的黑店,大土地神系统
  11. 大青山发生火情!内蒙古发生多起祭祖引发的火灾,数十人被拘...
  12. Java多重分支实现正负数判断
  13. 错误 '800a03ea'
  14. 不入门级代码教程(仅供参考)
  15. s.length什么意思
  16. 关于工业相机编程调用SDK二次开发的一些步骤流程
  17. 词汇总结·《雅思词汇看这本书就够了》
  18. Asterisk 开启日志,记录SIP信令
  19. AMap初级实战之二(MoveAnimation moveTo、moveAlong)
  20. python拼写_用 Python 27 行实现拼写纠正

热门文章

  1. android+更换sd卡,Android手机上如何无痛替换SD卡,扩展存储空间
  2. 自学车载以太网笔记(2)
  3. CentOS 8 EOL 寿命终止后如何切换源?
  4. SpringBoot 停车场管理系统(附源码)
  5. 数据结构---学习前的必知知识
  6. LintCode 764. 计算圆周长和面积 Java算法
  7. 营收连续六个季度上扬 网易有道如何做到增长“有道”?
  8. steps 逐帧动画
  9. java百度地图逆地址解析_Web服务Geocoding API-百度地图
  10. vs配置openNI2以及NiTE2