博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThinkPHP学习之CURD操作(一)
阅读量:7256 次
发布时间:2019-06-29

本文共 2974 字,大约阅读时间需要 9 分钟。

写在前面

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

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

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

要同学想要学习TP的可以点击 学习,大家一起进步。

CURD操作

什么是CURD操作? 实际上是对数据库增删改查的简称。 包括了createupdatereaddelete四个基本操作。 在TP中对CURD操作的实现是addsaveselectupdate

打开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方法,而是直接传递$dataadd方法,那么_facade就会把'confrim' => 'adhe99211' ,'hid' => 'register'删除,变成:

array(     'user_name'     => 'xiamsahfw',     'password'      => 'adhe99211' ,     'email'         => '221131@qq.com'                );复制代码

为了可能的连贯操作,add会调用_parseOptions进行表达式分析。 在表达式分析后即使没进行任何连贯操作,在返回的值也存在两个元素:

Array ([table] => user[model] => User)复制代码

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

如果之前存在连贯操作,如wheregroup 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

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

转载于:https://juejin.im/post/5a30f2d3f265da431a432fc3

你可能感兴趣的文章
python实现朴素贝叶斯
查看>>
Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
查看>>
Java操作MongoDB:连接&增&删&改&查
查看>>
Maven使用
查看>>
用python脚本把windows的文件上传到linux中
查看>>
m_Orchestrate learning system---三十四、使用重定义了$的插件的时候最容易出现的问题是什么...
查看>>
打开居中显示的窗口
查看>>
thinkphp多层volist实现多表查询
查看>>
TextView实现跑马灯效果
查看>>
使用ivim配置vim
查看>>
网络对抗作业 一
查看>>
用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
查看>>
PHP性能优化
查看>>
MySQL把文件导入表中
查看>>
redis配置说明
查看>>
display:inline-block,block,inline的区别与用法
查看>>
LeetCode 146: LRU Cache
查看>>
MFC编程汇总
查看>>
【NOIP2013】火柴排队
查看>>
取汉字拼音首字母的存储过程--很值得收藏的数据库自定义函数
查看>>