>  기사  >  백엔드 개발  >  Thinkphp3.2.0 setInc 사용법 단계 상세 설명

Thinkphp3.2.0 setInc 사용법 단계 상세 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-19 13:59:561609검색

이번에는 thinkphp3.2.0 setInc를 사용하는 단계와 thinkphp3.2.0 setInc를 사용할 때 주의사항에 대해 자세히 설명하겠습니다. 다음은 실제 사례입니다.

먼저 setInc의 공식 예를 살펴보겠습니다.

필드와 자동 증가 값이 필요합니다(기본값은 1)

다음을 통해 단계별로 분석해 보겠습니다. 예 하단 레이어 구현 방법:

<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller {
  public function test() {
    $tb_test = M(&#39;test&#39;);
    $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);
  }

여기서 일반적으로 사용되는 저장 메소드를 볼 수 있습니다. 여기서 $data[$field] = $value;는 실제로 $data['test_number'] = array( "exp","test_number+2")

그런 다음 가장 일반적으로 사용되는 저장 방법을 살펴보겠습니다.

/**
   * 保存数据
   * @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의 실행 메소드를 사용했습니다.

/**
   * 执行语句
   * @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가 어떻게 실행되는지 더 잘 이해하고 있다고 믿습니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

PHP에서 다중 선형 회귀 시뮬레이션 곡선 알고리즘을 구현하는 단계에 대한 자세한 설명

PHP에서 큰따옴표로 묶인 배열 요소에 액세스할 때 오류를 처리하는 방법

위 내용은 Thinkphp3.2.0 setInc 사용법 단계 상세 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.