thinkphp3.2.0 setInc方法 源码全面解析

thinkphp3.2.0 setInc方法 源码全面解析

下面小编就为大家分享一篇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方法源码全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

thinkphp3.2.0 setInc方法 源码全面解析