定义字段
1、为什么需要定义字段
在每次实例化模型时,系统都会自动执行以下代码:
调试界面如下图所示:
由上图可知,我们每次调用模型进行实例化时,系统都会自动执行SQL语句:show columns,这条语句代表分析模型对应的数据表的表结构,在实际项目开发中,这个语句是非常耗时的,而且其对数据库的开销也非常大,那么在实际开发时最好缓存数据表的字段信息。
2、字段缓存
- 字段缓存保存在Runtime/Data/_fields/ 目录下面
- 只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。
- 可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存
- 可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可
?
关闭APP_DEBUG后,字段会自动缓存,效果如下图所示:
程序运行效果:
我们发现,当我们开启了字段缓存后,系统会自动缓存数据表字段,以后每次实例化模型时,系统不会在分析表的表结构,而是去读缓存的文本文件。这样可以减少对数据库服务器的压力。
?
实际项目开发中,我们也可以通过配置文件中配置参数来决定是否需要开启字段缓存:
3、定义字段(重要)
通过以上字段缓存我们发现,虽然我们可以解决ThinkPHP对数据库服务器的压力,但是其在实例化模型时需要读取缓存的文本文件来分析表的表结构,这样会造成服务器的I/O开销,有没有办法可以解决这个问题呢?
答:可以使用定义字段的形式来解决这个问题。
路径:自定义模型文件中
定义语法:
protected $fields=array(数据表字段信息…);
示例代码:
以后我们在实例化自定义模型时,调试结果如下:
4、定义主键(重要)
在ThinkPHP中存在一个小bug,如果你的数据表中没有定义id主键,而是使用其他字段作为项目。其在操作时,如果使用主键作为操作条件,会产生异常结果。遇到这种情况,可以使用如下方式解决:
在自定义模型中,可以$pk属性,如下图所示:
时间: 2024-10-15 17:49:49