我们先来看一下setInc的官方示例:
需要一个字段和一个自增的值(默认为1)
我们通过下面这个例子来一步步分析他的底层是怎么实现的:
?phpnamespace主页控制器;使用思考控制器;类测试控制器扩展了控制器{公共函数测试(){ $ TB _ test=M(' test ');$ TB _ test-其中(['id'=1])-setInc('test_number ',2);//每次添加2转储($ TB _ test-GetLastSqL());//字符串(67)' UPDATE ` TB _ test ` SET ` test _ number `=test _ number 2 WHERE(' id `=1)' } }第一步肯定是要找到setInc方法的源码:
这里我用到了phpstrom全局搜索的方法,找到了setInc是在项目 ThinkPHP 库思考模型。类。服务器端编程语言(Professional Hypertext Preprocessor的缩写)下
/** * 字段值增长* @访问公共* @param字符串$字段字段名* @param整数$步骤增长值* @ return boolean */public函数setInc($field,$ step=1){ return $ this-setField($field,array('exp ',$ field).' '.$ step));}可以看到这里用到了设置构架数组的域这个方法,然后用经历自定义表达式设置$field=$field $step到这里,我们稍微了解了一点原理。
可是问题又来了设置构架数组的域又是怎么实现的呢?在同个文件下,找到设置构架数组的域方法:
/** * 设置记录的某个字段值* 支持使用数据库字段和方法* @ access public * @ param string | array $ field字段名* @param字符串$值字段值* @返回布尔值*/public函数setField($field,$ value=' '){ if(is _ array($ field)){ $ data=$ field;} else { $ data[$ field]=$ value;} return $ this-save($ data);}这里我们看到了常用到的救援方法,这里的$ data[$ field]=$ value;其实就是$data['test_number']=数组(“exp”,“test_number 2”)
接着来看最常用的救援方法:
/** * 保存数据* @访问公共* @param混合$数据数据* @param数组$选项表达式* @返回布尔值*/public函数save($data=' ',$ options=array()){ if(empty($ data)){//没有传递数据,获取当前数据对象的值if(!empty($ this-data)){ $ data=$ this-data;//重置数据$ this-data=array();} else { $ this-error=L(' _ DATA _ TYPE _ INVALID _ ');返回false} } //数据处理$ data=$ this-_ facade($ data);//分析表达式$ options=$ this-_ parseOptions($ options);$ PK=$ this-GetPK();if(!isset($ options[' where ']){//如果存在主键数据则自动作为更新条件if(isset($ data[$ PK]){ $其中[$ PK]=$ data[$ PK];$ options[' where ']=$ where;未设置($ data[$ PK]);}else{ //如果没有任何更新条件则不执行$ this-ERROR=L(' _ OPERATION _ ERROR _ ');返回false } } if(is _ array($ options[' where '])is set($ options[' where '][$ PK]){ $ PK value=$ options[' where '][$ PK];} if(false==$ this-_ before _ update($ data,$ options)){ return false;} $result=$this-db-update($data,$ options);如果(假的!==$ result){ if(isset($ PKVaLue))$ data[$ PK]=$ PKVaLue;$this-_after_update($data,$ options);}返回$ result}最主要是的$ options=$ this-_ parseOptions($ options);和$result=$this-db-update($data,$ options);前者把参数转换成用于拼接结构化查询语言的字符串数组,后者调用了项目 t测试 ThinkPHP 库ThinkDb.class.php下的更新方法:
/** * 更新记录* @访问公共* @param混合$数据数据* @param数组$选项表达式* @ return false | integer */public function update($ data,$ options){ $ this-model=$ options[' model '];$sql='UPDATE ' .$ this-ParseTable($ options[' table ']).$this-parseSet($data).$this-parseWhere(!空($options['where'])?$options['where']: ' ').$this-parseOrder(!空($options['order'])?$options['order']: ' ').$this-parseLimit(!空($options['limit'])?$options['limit']: ' ').$ this-parseLock(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 string $str sql指令* @ return integer | false */public函数execute($ str){ $ this-init connect(true);if(!$this-_linkID)返回false $ this-查询字符串=$ str//释放前次的查询结果if($ this-queryID){ $ this-free();} N('db_write ',1);//记录开始执行时间g(' queryStartTime ');$result=mysql_query($str,$ this-_ LinkID);$ this-debug();if(false===$ result){ $ this-error();返回false } else { $ this-NumRows=MySQL _ affected _ rows($ this-_ LinkID);$ this-LastInSid=MySQL _ insert _ id($ this-_ LinkID);返回$ this-NumRows;} }最后用最底层的mysql_query执行结构化查询语言语句。
到此为止setInc的源码已经大致过了一遍了。想必大家对setInc如何执行也更了解了一点。
以上这篇thinkphp3.2.0 setInc方法源码全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。