下面小编就为大家分享一篇thinkphp3.2.0 setInc方法源码全面解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
我们先来看一下setInc的官方示例:
需要一个字段和一个自增的值(默认为1)
我们通过下面这个例子来一步步分析他的底层是怎么实现的:
?服务器端编程语言(专业超文本预处理器的缩写)
命名空间主页控制器
使用思考控制器;
类测试控制器扩展控制器{
公共函数测试(){
$ TB _ test=M( test );
$ TB _ test-where([ id =1])-setInc( test _ number ,2);//每次添加2
dump($ TB _ test-getLastSql());
//string(67) UPDATE ` TB _ test ` SET ` test _ number `=test _ number 2 WHERE(` id `=1)
}
}
第一步肯定是要找到setInc方法的源码:
这里我用到了phpstrom全局搜索的方法,找到了setInc是在proj ThinkPHP Library Think model。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)下
/**
* 字段值增长
* @访问公共
* @ param stringfield字段名
* @ param integerstep增长值
* @返回布尔值
*/
公共函数setInc($field,$step=1) {
返回$this-setField($field,array(exp ,$field . .$ step));
}
可以看到这里用到了塞特菲尔德这个方法,然后用经历自定义表达式设置$field=$field $step到这里,我们稍微了解了一点原理。
可是问题又来了setField又是怎么实现的呢?在同个文件下,找到setField方法:
/**
* 设置记录的某个字段值
* 支持使用数据库字段和方法
* @访问公共
* @param string|array $field字段名
* @param字符串美元值字段值
* @返回布尔值
*/
公共函数setField($field,$value=) {
if(is_array($field)) {
$ data=$ field
}否则{
$ data[$ field]=$ value;
}
返回$ this-save($ data);
}
这里我们看到了常用到的救援方法,这里的$ data[$ field]=$ value;其实就是$data[测试编号]=数组( exp ,测试编号2 )
接着来看最常用的save方法:
/**
* 保存数据
* @访问公共
* @param mixed $data数据
* @ param array $选项表达式
* @返回布尔值
*/
公共函数保存($data= ,$options=array()) {
if(empty($data)) {
//没有传递数据,获取当前数据对象的值
如果(!空($this-data)) {
$ data=$ this-data;
//重置数据
$ this-data=array();
}否则{
$ this-error=L( _ DATA _ TYPE _ INVALID _ );
返回错误的
}
}
//数据处理
$ data=$ this-_ facade($ data);
//分析表达式
$ options=$ this-_ parse options($ options);
$ PK=$ this-getPk();
如果(!isset($ options[ where ]){
//如果存在主键数据则自动作为更新条件
if(isset($ data[$ PK]){
$ where[$ PK]=$ data[$ PK];
$ options[ where ]=$ where;
unset($ data[$ PK]);
}否则{
//如果没有任何更新条件则不执行
$ this-error=L( _ OPERATION _ error _ );
返回错误的
}
}
如果(is _ array($ options[ where ])已设置($ options[ where ][$ PK]){
$ PK value=$ options[ where ][$ PK];
}
if(false===$ this-_ before _ update($ data,$options)) {
返回错误的
}
$result=$this-db-update($data,$ options);
如果(假!==$result) {
if(isset($ PK值))$ data[$ PK]=$ PK值;
$this-_after_update($data,$ options);
}
返回$结果
}
最主要是的$ options=$ this-_ parse options($ options);和$result=$this-db-update($data,$ options);前者把参数转换成用于拼接结构化查询语言的字符串数组,后者调用了proj TP test ThinkPHP Library Think db。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)下的更新方法:
/**
* 更新记录
* @访问公共
* @param mixed $data数据
* @ param array $选项表达式
* @return false |整数
*/
公共函数更新($data,$options) {
$ this-model=$ options[ model ];
$sql=UPDATE 。$ this-parse表($ options[ table ])。$this-parseSet($data)。$this-parseWhere(!空($options[where])?$options[where]: )。$this-parseOrder(!空($options[order])?$options[order]: )。$this-parseLimit(!空($options[limit])?$options[limit]: )。$ this-parse lock(isset($ options[ lock ])?$options[lock]:false)。$this-parseComment(!空($options[comment])?$ options[ comment ]: );
返回$this-execute($sql,$this-parseBind(!空($options[bind])?$ options[ bind ]:array()));
}
最后其实就是用到了proj ThinkPHP Library Think Db Driver MySQL。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)这个驱动类的执行方法。
/**
* 执行语句
* @访问公共
* @ param stringstr SQL指令
* @返回整数|假
*/
公共函数执行($str) {
$ this-init connect(true);
如果(!$this-_linkID)返回错误的
$ this-query str=$ str;
//释放前次的查询结果
if($ this-queryID){ $ this-free();}
N(db_write ,1);
//记录开始执行时间
g(查询开始时间);
$result=mysql_query($str,$ this-_ linkID);
$ this-debug();
if ( false===$result) {
$ this-error();
返回错误的
}否则{
$ this-numRows=MySQL _ affected _ rows($ this-_ linkID);
$ this-lastInsID=MySQL _ insert _ id($ this-_ linkID);
返回$ this-numRows;
}
}
最后用最底层的mysql_query执行结构化查询语言语句。
到此为止,setInc的源码已经大致过了一遍了。想必大家对setInc如何执行也更了解了一点。
以上这篇thinkphp3.2.0 setInc方法源码全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。