thinkphp3.2.0 setInc-Methodenquellcode umfassende Analyse von PHP-Beispielen

jacklove
Freigeben: 2023-04-02 06:06:01
Original
2078 Leute haben es durchsucht

Der unten stehende Herausgeber wird Ihnen eine umfassende Analyse des Quellcodes der setInc-Methode von thinkphp3.2.0 mitteilen, die einen guten Referenzwert hat. Folgen wir dem Herausgeber und werfen wir einen Blick darauf.

Schauen wir uns zunächst das offizielle Beispiel von setInc an:

Erfordert ein Feld und einen Wert für die automatische Inkrementierung (Standard ist 1)

Anhand des folgenden Beispiels analysieren wir Schritt für Schritt, wie die zugrunde liegende Implementierung implementiert wird:

<?php
namespace Home\Controller;
use Think\Controller;

class TestController extends Controller {
  public function test() {
    $tb_test = M(&#39;test&#39;);
    $tb_test->where([&#39;id&#39;=>1])->setInc(&#39;test_number&#39;,2); //每次添加2
    dump($tb_test->getLastSql());
    //string(67) "UPDATE `tb_test` SET `test_number`=test_number+2 WHERE ( `id` = 1 )"
  }
}
Nach dem Login kopieren

Der erste Schritt besteht darin, den Quellcode der setInc-Methode zu finden:

Hier I verwendete globale PHP-Suche Die gefundene Methode ist setInc unter projThinkPHPLibraryThinkModel.class.php

/**
   * 字段值增长
   * @access public
   * @param string $field 字段名
   * @param integer $step 增长值
   * @return boolean
   */
  public function setInc($field,$step=1) {
    return $this->setField($field,array(&#39;exp&#39;,$field.&#39;+&#39;.$step));
  }
Nach dem Login kopieren

Sie können sehen, dass hier die setField-Methode verwendet wird, und dann exp verwenden Passen Sie den Ausdruck an Set $field = $field + $step An diesem Punkt verstehen wir ein wenig über das Prinzip.

Aber die Frage kommt wieder. Wie wird setField implementiert? Suchen Sie unter derselben Datei die setField-Methode:

/**
   * 设置记录的某个字段值
   * 支持使用数据库字段和方法
   * @access public
   * @param string|array $field 字段名
   * @param string $value 字段值
   * @return boolean
   */
  public function setField($field,$value=&#39;&#39;) {
    if(is_array($field)) {
      $data      =  $field;
    }else{
      $data[$field]  =  $value;
    }
    return $this->save($data);
  }
Nach dem Login kopieren

Hier sehen wir die häufig verwendete Speichermethode, hier ist $data[ $ field] = $value; Tatsächlich ist es $data['test_number'] = array("exp","test_number+2")

Dann schauen wir uns die am häufigsten vorkommenden an Verwendete Speichermethode:

/**
   * 保存数据
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return boolean
   */
  public function save($data=&#39;&#39;,$options=array()) {
    if(empty($data)) {
      // 没有传递数据,获取当前数据对象的值
      if(!empty($this->data)) {
        $data      =  $this->data;
        // 重置数据
        $this->data   =  array();
      }else{
        $this->error  =  L(&#39;_DATA_TYPE_INVALID_&#39;);
        return false;
      }
    }
    // 数据处理
    $data    =  $this->_facade($data);
    // 分析表达式
    $options  =  $this->_parseOptions($options);
    $pk     =  $this->getPk();
    if(!isset($options[&#39;where&#39;]) ) {
      // 如果存在主键数据 则自动作为更新条件
      if(isset($data[$pk])) {
        $where[$pk]     =  $data[$pk];
        $options[&#39;where&#39;]  =  $where;
        unset($data[$pk]);
      }else{
        // 如果没有任何更新条件则不执行
        $this->error    =  L(&#39;_OPERATION_WRONG_&#39;);
        return false;
      }
    }
    if(is_array($options[&#39;where&#39;]) && isset($options[&#39;where&#39;][$pk])){
      $pkValue  =  $options[&#39;where&#39;][$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;
  }
Nach dem Login kopieren

Das Wichtigste ist $options = $this->_parseOptions($options); result = $this- >db->update($data,$options); Ersteres konvertiert die Parameter in ein String-Array zum Spleißen von SQL, und letzteres ruft die Update-Methode unter projtptestThinkPHPLibraryThinkDb.class.php auf:

/**
   * 更新记录
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return false | integer
   */
  public function update($data,$options) {
    $this->model =  $options[&#39;model&#39;];
    $sql  = &#39;UPDATE &#39;
      .$this->parseTable($options[&#39;table&#39;])
      .$this->parseSet($data)
      .$this->parseWhere(!empty($options[&#39;where&#39;])?$options[&#39;where&#39;]:&#39;&#39;)
      .$this->parseOrder(!empty($options[&#39;order&#39;])?$options[&#39;order&#39;]:&#39;&#39;)
      .$this->parseLimit(!empty($options[&#39;limit&#39;])?$options[&#39;limit&#39;]:&#39;&#39;)
      .$this->parseLock(isset($options[&#39;lock&#39;])?$options[&#39;lock&#39;]:false)
      .$this->parseComment(!empty($options[&#39;comment&#39;])?$options[&#39;comment&#39;]:&#39;&#39;);
    return $this->execute($sql,$this->parseBind(!empty($options[&#39;bind&#39;])?$options[&#39;bind&#39;]:array()));
  }
Nach dem Login kopieren

Am Ende haben wir tatsächlich die Ausführungsmethode der Treiberklasse projThinkPHPLibraryThinkDbDriverMysql.class.php verwendet.

/**
   * 执行语句
   * @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(&#39;db_write&#39;,1);
    // 记录开始执行时间
    G(&#39;queryStartTime&#39;);
    $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;
    }
  }
Nach dem Login kopieren

Schließlich wird die unterste Ebene mysql_query verwendet, um die SQL-Anweisung auszuführen.

Bisher wurde der Quellcode von setInc grob überprüft. Ich glaube, dass jeder ein besseres Verständnis dafür hat, wie setInc ausgeführt wird.

Die obige umfassende Analyse des Quellcodes der setInc-Methode von thinkphp3.2.0 ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie die chinesische PHP-Website unterstützen.

Verwandte Empfehlungen:

PHP-Beispiele für die Verwendung von Binärdateien zum Speichern des Benutzerstatus PHP-Kenntnisse

PHP+Redis-Nachrichtenwarteschlange an hohes erreichen Beispiel für Registrantenstatistiken unter gleichzeitiger PHP-Instanz

Laravel ORM öffnet nur erstellte_at-Methoden zum Zusammenfassen der PHP-Instanz

Das obige ist der detaillierte Inhalt vonthinkphp3.2.0 setInc-Methodenquellcode umfassende Analyse von PHP-Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage