Maison > développement back-end > tutoriel php > Explication détaillée des étapes pour utiliser setInc dans thinkphp3.2.0

Explication détaillée des étapes pour utiliser setInc dans thinkphp3.2.0

php中世界最好的语言
Libérer: 2023-03-26 21:12:01
original
1638 Les gens l'ont consulté

Cette fois, je vais vous donner une explication détaillée des étapes pour utiliser thinkphp3.2.0 setInc. Quelles sont les précautions lors de l'utilisation de thinkphp3.2.0 setInc. Voici des cas pratiques, jetons un coup d'œil.

Jetons d'abord un coup d'œil à l'exemple officiel de setInc :

nécessite un champ et Une valeur auto-croissante (la valeur par défaut est 1)

Utilisons l'exemple suivant pour analyser étape par étape comment son implémentation sous-jacente est mise en œuvre :

<?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 )"
  }
}
Copier après la connexion

La première étape consiste à trouver le code source de la méthode setInc :

Ici, j'ai utilisé la méthode de recherche globale phpstrom et j'ai découvert que setInc est sous 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));
  }
Copier après la connexion

Vous pouvez voir que la méthode setField est utilisée ici, puis l'expression personnalisée exp est utilisée pour définir $field = $field + $step À ce stade, nous comprenons un peu le principe.

Mais la question revient. Comment setField est-il implémenté ? Sous le même fichier, recherchez la méthode 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);
  }
Copier après la connexion

Ici, nous voyons la méthode de sauvegarde couramment utilisée, voici $data[$field] = $value; En fait, c'est $data['test_number'] = array("exp","test_number+2")

Regardons ensuite la méthode de sauvegarde la plus couramment utilisée. :

/**
   * 保存数据
   * @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;
  }
Copier après la connexion

La chose la plus importante est $options = $this->_parseOptions($options); $data,$options ); Le premier convertit les paramètres en un tableau de chaînes pour l'épissage SQL, et le second appelle la méthode de mise à jour sous projtptestThinkPHPLibraryThinkDb.class.php :

/**
   * 更新记录
   * @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()));
  }
Copier après la connexion

est réellement utilisé à la fin La méthode d'exécution de la classe de pilote 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;
    }
  }
Copier après la connexion

Enfin, utilisez le mysql_query du bas pour exécuter l'instruction SQL.

Jusqu'à présent, le code source de setInc a été grossièrement revu. Je pense que tout le monde comprend mieux comment setInc est exécuté.

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée des étapes de mise en œuvre de l'algorithme de courbe de simulation de régression linéaire multiple en PHP

Accès au tableau éléments entre guillemets doubles en PHP Comment gérer les rapports d'erreurs

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal