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模式,开启数据字段缓存
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 对应的另外一个位置也要修改一下
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
