zoukankan      html  css  js  c++  java
  • 定义字段

    定义字段

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

  • 相关阅读:
    为什么在SqlServer流水模式下,事务无法启动?
    默认web站点被删除,如何设置新的默认站点?
    用C#实现基于TCP协议的网络通讯
    如何通过DataRelation关联两个DataGrid,实现主从表。
    如何设置网站的会话时间?
    性能测试基本概念释疑
    C#中如何获取服务器IP,名称,操作系统,客户端IP,名称!
    DataGridComboBoxColumn控件
    端口基础知识
    P2P之UDP穿透NAT的原理与实现
  • 原文地址:https://www.cnblogs.com/nyxd/p/5366120.html
Copyright © 2011-2022 走看看