Thinkphp 开启字段缓存后,生成字段缓存文件bug修改

遇到问题描述如下:

项目中用到两数据库 ,一个基础数据库,基础数据库hq_gynzsxjy中有个站内信息表 hq_sf_message ;  一个微圈数据库hq_gynzsxjy_sxq(简化微信好友圈功能),微圈数据库有同样有个 消息表hq_sxq_message;

       项目为采用了分组,Model目录大致如下

Model 

                      Base

MessageModel.class.php,对应hq_sf_message表

     Sxq

MessageModel.class.php对应hq_sxq_message表

项目关闭debug模式,开启数据字段缓存

Runtime\Data\_fields下只生成文件hq_gynzsxjy.message.php,未生成hq_qynzsxjy_sxq.message.php文件

两个表结构并不一致的,导致已生成缓存后,另一个信息表的相关操作有误(所取字段不同);

查询tp框架后解决办法:

     thinkphp的核心文件Model.class.php中

/**
 * 自动检测数据表信息
 * @access protected
 * @return void
 */
protected function _checkTableInfo() {
    // 如果不是Model类 自动记录数据表信息
    // 只在第一次执行记录
    if(empty($this->fields)) {
        // 如果数据表字段没有定义则自动获取
        if(C('DB_FIELDS_CACHE')) {
            $db   =  $this->dbName?$this->dbName:C('DB_NAME');
            $fields = F('_fields/'.strtolower($db.'.'.$this->name));
            if($fields) {
                $version    =   C('DB_FIELD_VERSION');
                if(empty($version) || $fields['_version']== $version) {
                    $this->fields   =   $fields;
                    return ;
                }
            }
        }
        // 每次都会读取数据表信息
        $this->flush();
    }
}

标红的两行有误,正常情况下如果连接多个数据库,只取了C('DB_NAME');如果是多数据库连接增加配置

// 实习圈相关数据库
'DB_SXQ' => array(
    /* 数据库配置 */
    'DB_TYPE' => 'mysql', // 数据库类型
    'DB_HOST' => $db_host, // 服务器地址
    'DB_NAME' => $db_name. '_sxq',// 数据库名
    'DB_USER' => $db_user, // 用户名
    'DB_PWD' => $db_pass, // 密码
    'DB_PREFIX' => 'hq_'
),
应该取的是C('DB_SXQ.DB_NAME');修改如下:

$connectionStr = $this->connection?$this->connection.'.':'';
$db   =  $this->dbName?$this->dbName:C($connectionStr.'DB_NAME');
$fields = F('_fields/'.strtolower($db.'.'.$this->name));

修改后生成字段缓存文件

Runtime\Data\_fields下生成文件hq_gynzsxjy.message.php 和hq_gynzsxjy_sxq.message.php

如果要求严格的话可以将下面

$fields = F('_fields/'.strtolower($db.'.'.$this->name));

可以改为

$nameStr = $this->tableName?$this->tableName:$this->name;

$fields = F('_fields/'.strtolower($db.'.'.$nameStr));
源代码中取的$this->name为model名称,正常应该先取表名,表名未定义再取model名称;

最后生成缓存文件为:数据库名 . 表名


F('_fields       对应的另外一个位置也要修改一下


你可能感兴趣的:(Thinkphp 开启字段缓存后,生成字段缓存文件bug修改)