下面为大家分享一篇thinkphp3.2.0 setInc方法 源码全面解析,具有很好的参考价值,希望对大家有所帮助。
我们先来看一下setInc的官方示例:

需要一个字段和一个自增的值(默认为1)
我们通过下面这个例子来一步步分析他的底层是怎么实现的:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller {
public function test() {
$tb_test = M('test');
$tb_test ->where(['id'=>1])->setInc('test_number',2);
dump( $tb_test ->getLastSql());
}
}
|
登录后复制
第一步肯定是要找到setInc方法的源码:
这里我用到了phpstrom全局搜索的方法,找到了setInc是在proj\ThinkPHP\Library\Think\Model.class.php下
1 2 3 4 5 6 7 8 9 10 |
public function setInc( $field , $step =1) {
return $this ->setField( $field , array (' exp ', $field .'+'. $step ));
}
|
登录后复制
可以看到这里用到了setField这个方法,然后用exp自定义表达式设置 $field = $field + $step 到这里,我们稍微了解了一点原理。
可是问题又来了setField又是怎么实现的呢?在同个文件下,找到setField方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function setField( $field , $value ='') {
if ( is_array ( $field )) {
$data = $field ;
} else {
$data [ $field ] = $value ;
}
return $this ->save( $data );
}
|
登录后复制
这里我们看到了常用到的save方法,这里的 $data[$field] = $value; 其实就是 $data['test_number'] = array("exp","test_number+2")
接着来看最常用的save方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
public function save( $data ='', $options = array ()) {
if ( empty ( $data )) {
if (! empty ( $this ->data)) {
$data = $this ->data;
$this ->data = array ();
} else {
$this ->error = L('_DATA_TYPE_INVALID_');
return false;
}
}
$data = $this ->_facade( $data );
$options = $this ->_parseOptions( $options );
$pk = $this ->getPk();
if (!isset( $options ['where']) ) {
if (isset( $data [ $pk ])) {
$where [ $pk ] = $data [ $pk ];
$options ['where'] = $where ;
unset( $data [ $pk ]);
} else {
$this ->error = L('_OPERATION_WRONG_');
return false;
}
}
if ( is_array ( $options ['where']) && isset( $options ['where'][ $pk ])){
$pkValue = $options ['where'][ $pk ];
}
if (false === $this ->_before_update( $data , $options )) {
return false;
}
$result = $this ->db->update( $data , $options );
if (false !== $result ) {
if (isset( $pkValue )) $data [ $pk ] = $pkValue ;
$this ->_after_update( $data , $options );
}
return $result ;
}
|
登录后复制
最主要是的$options = $this->_parseOptions($options);和$result = $this->db->update($data,$options); 前者把参数转换成用于拼接sql的字符串数组,后者调用了proj\tptest\ThinkPHP\Library\Think\Db.class.php下的update方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public function update( $data , $options ) {
$this ->model = $options ['model'];
$sql = 'UPDATE '
. $this ->parseTable( $options ['table'])
. $this ->parseSet( $data )
. $this ->parseWhere(! empty ( $options ['where'])? $options ['where']:'')
. $this ->parseOrder(! empty ( $options ['order'])? $options ['order']:'')
. $this ->parseLimit(! empty ( $options ['limit'])? $options ['limit']:'')
. $this ->parseLock(isset( $options ['lock'])? $options ['lock']:false)
. $this ->parseComment(! empty ( $options ['comment'])? $options ['comment']:'');
return $this ->execute( $sql , $this ->parseBind(! empty ( $options ['bind'])? $options ['bind']: array ()));
}
|
登录后复制
最后其实就是用到了proj\ThinkPHP\Library\Think\Db\Driver\Mysql.class.php这个驱动类的execute方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public function execute( $str ) {
$this ->initConnect(true);
if ( ! $this ->_linkID ) return false;
$this ->queryStr = $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();
return false;
} else {
$this ->numRows = mysql_affected_rows( $this ->_linkID);
$this ->lastInsID = mysql_insert_id( $this ->_linkID);
return $this ->numRows;
}
}
|
登录后复制
最后用最底层的mysql_query执行SQL语句。
到此为止,setInc的源码已经大致过了一遍了。想必大家对setInc如何执行也更了解了一点。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
thinkPHP3.2实现微信接入及查询token值的方法
以上是thinkphp3.2.0中setInc方法的源码分析的详细内容。更多信息请关注PHP中文网其他相关文章!