tp数据表字段缓存

Posted pcx105

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tp数据表字段缓存相关的知识,希望对你有一定的参考价值。

来源: https://www.cnblogs.com/webclz/p/4256334.html

在维护一个tp写的项目,因为需要在一个表(列如user)中新增一个字段status,但是不论如何就是无法给status赋值,查了资料才发现,原来是tp的数据表字段缓存在搞鬼。

在runtime>Data>_fields文件中找到对应的文件,文件名与表名同,这里是status.php,增加status。再次尝试,立马就可以了。

今天在应用thinkphp框架开发的程序做些二次开发修改, 其中有改动到数据结构,新增了几个字段. 调用 M(‘xxx’)->add($data)  插入值时,新增的字段数据总是插入不进去,每次都是默认的值, 一直找看是不是什么语句写错了, 找了半天也没出个所以然来.  后来将模型对象打印出来仔细查看,发现-他的 protected :成员变量 $fields  字段信息 中没有我刚才添加的新字段名称.  于是恍然—-缓存了…   清空缓存 . 终于可以正常插入数据了. 
        原来TP在配置文件中如果没有关闭字段缓存设置,默认是开启的,只要一运行它就会将数据字段信息缓存到~Runtime/Data/_files  文件夹下,并以数组方式存放在文件中.    protected $fields = array(….);
当然你也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可,定义格式如下:
PHP代码
class UserModel extends Model    
protected $fields = array(   
‘id’,    
‘username’,    
‘email’,    
‘age’,    
‘_pk’=>’id’,   
‘_autoinc’=>true   
)   
   
其中_pk 表示主键字段名称 _autoinc 表示主键是否自动增长类型
可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存,如果在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文件中增加如下配置:
PHP代码
‘DB_FIELDS_CACHE’=>false   
调试模式下面由于考虑到数据结构可能会经常变动,所以默认是关闭字段缓存的。ThinkPHP的默认约定每个数据表的主键名采用统一的id作为标识,并且是自动增长类型的。系统会自动识别当前操作的数据表的字段信息和主键名称,所以即使你的主键不是id,也无需进行额外的设置,系统会自动识别。要在外部获取当前数据对象的主键名称,请使用下面的方法:
PHP代码
$pk = $Model->getPk();  
目前不支持联合主键的自动操作。
在个别情况下,可能不需要对当前操作的数据表进行字段缓存,或许是由于采用了动态方式或者当前模型根本没有任何相关的数据表,我们可以设置autoCheckFields属性来关闭某个模型类的字段获取和缓存。
使用getDbFields方法可以获取当前数据对象的全部字段信息:
PHP代码
$fields = $User->getDbFields();  
由于没有仔细看手册,浪费了不少时间.

 

以上是关于tp数据表字段缓存的主要内容,如果未能解决你的问题,请参考以下文章

TP5 生成数据库字段 和 路由 缓存来提升性能

数据库中新加了字段,tp插入库操作,加不进字段数据

TP框架部署模式下字段不更新及M方法和D方法区别

tp5命令行基础介绍

TP连接数据库配置及Model数据模型层

使用TP自带缓存时。出现第一次拿不到数据。