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

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

内容导读

收集整理的这篇技术教程文章主要介绍了thinkphp3.2.0setInc方法源码全面解析php实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4622字,纯文字阅读大概需要7分钟

内容图文

下面小编就为大家分享一篇thinkphp3.2.0 setInc方法 源码全面解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我们先来看一下setInc的官方示例:

需要一个字段和一个自增的值(默认为1)

我们通过下面这个例子来一步步分析他的底层是怎么实现的:

<?phpnamespace HomeController;use ThinkController;class TestController extends Controller {
public function test() {

$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是在projThinkPHPLibraryThinkModel.class.php下

/**
 * 字段值增长
 * @access public
 * @param string $field 字段名
 * @param integer $step 增长值
 * @return boolean
 */
public function setInc($field,$step=1) {

return $this->setField($field,array('exp',$field.'+'.$step));
}

可以看到这里用到了setField这个方法,然后用exp自定义表达式设置 $field = $field + $step 到这里,我们稍微了解了一点原理。

可是问题又来了setField又是怎么实现的呢?在同个文件下,找到setField方法:

/**
 * 设置记录的某个字段值
 * 支持使用数据库字段和方法
 * @access public
 * @param string|array $field 字段名
 * @param string $value 字段值
 * @return boolean
 */
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方法:

/**
 * 保存数据
 * @access public
 * @param mixed $data 数据
 * @param array $options 表达式
 * @return boolean
 */
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的字符串数组,后者调用了projtptestThinkPHPLibraryThinkDb.class.php下的update方法:

/**
 * 更新记录
 * @access public
 * @param mixed $data 数据
 * @param array $options 表达式
 * @return false | integer
 */
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()));
}

最后其实就是用到了projThinkPHPLibraryThinkDbDriverMysql.class.php这个驱动类的execute方法。

/**
 * 执行语句
 * @access public
 * @param string $str sql指令
 * @return integer|false
 */
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如何执行也更了解了一点。

以上这篇thinkphp3.2.0 setInc方法 源码全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持Gxl网。

相关推荐:

PHP 使用二进制保存用户状态的实例php技巧

PHP+Redis 消息队列 实现高并发下注册人数统计的实例php实例

laravel ORM 只开启created_at的几种方法总结php实例

以上就是thinkphp3.2.0 setInc方法 源码全面解析php实例的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的thinkphp3.2.0setInc方法源码全面解析php实例全部内容,希望文章能够帮你解决thinkphp3.2.0setInc方法源码全面解析php实例所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。



联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com