溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ThinkPHP如何實現(xiàn)轉(zhuǎn)換數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)到對應類型

發(fā)布時間:2021-06-22 15:26:59 來源:億速云 閱讀:273 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下ThinkPHP如何實現(xiàn)轉(zhuǎn)換數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)到對應類型,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體如下:

最近使用 ThinkPHP3.2.3 進行 API 開發(fā),發(fā)現(xiàn) ThinkPHP3.x 查詢數(shù)據(jù)庫返回所有字段值類型都是 String。以前開發(fā) web 的時候沒怎么注意這個,現(xiàn)在發(fā)現(xiàn)用到 API 開發(fā)很難辦,數(shù)據(jù)類型不對,不能每個字段都讓客戶端自己強制轉(zhuǎn)換一下。

查資料后發(fā)現(xiàn) ThinkPHP3.x 的 Model.class.php,提供了 _parseType 方法,在查詢完以后進行類型轉(zhuǎn)換,但需要我們手工調(diào)一下。

需要自己寫一個 Model 基類:

MBaseModel.class.php 繼承自 Model

use Think\Model;
class BaseModel extends Model
{
  protected function _after_select(&$resultSet, $options)
  {
    parent::_after_select($resultSet,$options);
    foreach ($resultSet as &$result) {
      $this->_after_find($result, $options);
    }
  }
  protected function _after_find(&$result, $options)
  {
    parent::_after_find($result,$options);
    foreach ($result as $field => $value) {
      $this->_parseType($result, $field);
    }
  }
}

然后所有自己寫的 Model 類都繼承自 MBaseModel.

注意:必須把上面兩個方法寫到 Model 的子類中。

本來,這樣已經(jīng)搞定了,但發(fā)現(xiàn) Model.class.php 的 _parseType 方法里有個低級 bug:

/**
* 數(shù)據(jù)類型檢測
* @access protected
* @param mixed $data 數(shù)據(jù)
* @param string $key 字段名
* @return void
*/
protected function _parseType(&$data,$key) {
    if(!isset($this->options['bind'][':'.$key]) && isset($this->fields['_type'][$key])){
      $fieldType = strtolower($this->fields['_type'][$key]);
      if(false !== strpos($fieldType,'enum')){
        // 支持ENUM類型優(yōu)先檢測
      }elseif(false === strpos($fieldType,'bigint') && false !== strpos($fieldType,'int')) {
        $data[$key]  = intval($data[$key]);
      }elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){
        $data[$key]  = floatval($data[$key]);
      }elseif(false !== strpos($fieldType,'bool')){
        $data[$key]  = (bool)$data[$key];
      }
    }
}
// 上面第13行修改為
}elseif(false !== strpos($fieldType,'bigint') || false !== strpos($fieldType,'int') || false !== strpos($fieldType,'tinyint')) {

以上是“ThinkPHP如何實現(xiàn)轉(zhuǎn)換數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)到對應類型”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI