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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: