pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

下面小編就為大家分享一篇thinkphp3.2.0 setInc方法 源碼全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我們先來看一下setInc的官方示例:

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

需要一個字段和一個自增的值(默認為1)

我們通過下面這個例子來一步步分析他的底層是怎么實現的:

<?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); //每次添加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.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的字符串數組,后者調用了proj\tptest\ThinkPHP\Library\Think\Db.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()));
  }
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了tp5(thinkPHP5)操作mongoDB數據庫的方法,結合實例形式簡單分析了mongoDB數據庫及thinkPHP5連接、查詢MongoDB數據庫的基本操作技巧,需要的朋友可以參考下
thinkphp官網在去年的時候發布了tp的顛覆版本thinkphp5,tp5確實比之前的版本好用了很多,那么下面這篇文章就來給大家介紹關于在云虛擬主機部署thinkphp5項目的相關資料,需要的朋友可以
這篇文章主要介紹了Thinkphp5行為使用方法匯總,需要的朋友可以參考下
這篇文章主要介紹了thinkphp5 加載靜態資源路徑與常量的方法的相關資料,需要的朋友可以參考下
這篇文章主要介紹了thinkphp5 URL和路由的功能詳解與實例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 学叉车培训|叉车证报名|叉车查询|叉车证怎么考-工程机械培训网 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 气动绞车,山东气动绞车,气动绞车厂家-烟台博海石油机械有限公司 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 耐酸泵,耐腐蚀真空泵,耐酸真空泵-淄博华舜耐腐蚀真空泵有限公司 精密模具-双色注塑模具加工-深圳铭洋宇通 | 首页|光催化反应器_平行反应仪_光化学反应仪-北京普林塞斯科技有限公司 | 定制防伪标签_防伪标签印刷_防伪标签厂家-510品保防伪网 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 517瓜水果特产网|一个专注特产好物的网站 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 学习虾-免费的学习资料下载平台 雪花制冰机(实验室雪花制冰机)百科 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 重庆私家花园设计-别墅花园-庭院-景观设计-重庆彩木园林建设有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 |