tp中遇到的相关方法

getDbFields 这个方法在tp手册的字段定义中 通常每个模型类是操作某个数据表,在大多数情况下,系统会自动获取当前数据表的字段信息。 系统会在模型首次实例化的时候自动获取数据表的字段信息(而且只需要一次,以后会永久缓存字段信息,除非设置不缓存或者删除),如果是调试模式则不会生成字段缓存文件,则表示每次都会重新获取数据表字段信息。 字段缓存保存在Runtime/Data/_fields/ 目录下面,缓存机制是每个模型对应一个字段缓存文件(注意:并非每个数据表对应一个字段缓存文件),命名格式是: 数据库名.数据表前缀+模型名(小写).php

demo.think_user.php // User模型生成的字段缓存文件
demo.top_article.php // Article模型生成的字段缓存文件

字段缓存包括数据表的字段信息、主键字段和是否自动增长,如果开启字段类型验证的话还包括字段类型信息等等,无论是用M方法还是D方法,或者用原生的实例化模型类一般情况下只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。 可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存,如果在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文件中增加如下配置:

// 关闭字段缓存
'DB_FIELDS_CACHE'=>false

注意:调试模式下面由于考虑到数据结构可能会经常变动,所以默认是关闭字段缓存的。 如果需要显式获取当前数据表的字段信息,可以使用模型类的getDbFields方法来获取当前数据对象的全部字段信息,例如:

$User = M('User');
$fields = $User->getDbFields();

如果你在部署模式下面修改了数据表的字段信息,可能需要清空Data/_fields目录下面的缓存文件,让系统重新获取更新的数据表字段信息,否则会发生新增的字段无法写入数据库的问题。

如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,例如:

namespace Home\Model;
use Think\Model;
class UserModel extends Model 
{ 
protected $fields = array('id', 'username', 'email', 'age');
 protected $pk = 'id';
//pk属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义
}

如果你的数据表使用了复合主键,可以这样定义:

namespace Home\Model;
use Think\Model;
class ScoreModel extends Model {
 protected $fields = array('user_id', 'lession_id','score'); 
protected $pk = array('user_id','lession_id');
}

除了可以设置数据表的字段之外,我们还可以定义字段的类型,用于某些验证环节。例如:

namespace Home\Model;
use Think\Model;
class UserModel extends Model {
  protected $fields = array('id', 'username', 'email', 'age', '_type'=>
array('id'=>'bigint','username'=>'varchar','email'=>'varchar','age'=>'int') );}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04上的三节点集群上部署CockroachDB

CockroachDB是一个开源的分布式SQL数据库,提供一致性、可伸缩性和生存性。

20620
来自专栏FreeBuf

GDB调试CVE-2018-5711 PHP-GD拒绝服务漏洞

下载、编译PHP源码 从github的PHP-src克隆下含有漏洞的版本,最好采取7.0以上版本,编译时候会比较简单,本次选用PHP7.1.9。编译环境为 阿里...

25050
来自专栏张首富-小白的成长历程

zabbix导入数据库报错1046 (3D000) : No database selected

95040
来自专栏Java大联盟

Java面试手册:JDBC

14410
来自专栏蘑菇先生的技术笔记

探索C#之虚拟桶分片

31540
来自专栏JetpropelledSnake

SQL学习之SqlMap SQL注入

50950
来自专栏大数据文摘

麻省理工三位教授教你一步步创建自己的R程序包(附完整教程下载)

19430
来自专栏Java编程技术

MySQL 中基于 XA 实现的分布式事务

Xa主要规定了RM与TM之间的交互,下面来看下XA规范中定义的RM 和 TM交互的接口:

14630
来自专栏乐沙弥的世界

system sys,sysoper sysdba 的区别

Oracle 中sys,system帐户以及登陆时的normal,sysoper,sysdba是经常容易混淆的几个概念,下面详细讲述了

9230
来自专栏hanlp学习笔记

HanLP分词器的使用方法

之前我有想过用机器学习的方法来进行词法分析,但是在项目中测试时正确率不够。于是这时候便有了 HanLP-汉语言处理包 来进行提取关键词的想法。

20900

扫码关注云+社区

领取腾讯云代金券