定义字段

定义字段

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属性,如下图所示:

posted @ 2016-04-07 23:24  尼农小道  阅读(373)  评论(0编辑  收藏  举报