牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-05-25 投稿人: 浏览次数:1538

遇到问题描述如下:

项目中用到两数据库 ,一个基础数据库,基础数据库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模式,开启数据字段缓存

RuntimeData\_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));

修改后生成字段缓存文件

RuntimeData\_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       对应的另外一个位置也要修改一下


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。