TP中的模型(二)
1.1、字段缓存
1.1.1、思考问题一
当使用save方法进行修改数据时。需要在传递的修改数据中增加主键才能正常的修改数据。为什么加上主键TP就知道了条件呢?原因是因为TP会自动的分析数据表结构
①创建测试方法
②结果如下
1.1.2、思考问题二
从目前所知当每次实例化模型对象时TP会自动的分析表结构(查询数据)。如果当前业务中有多次实例化操作,并且当前方法访问的比较多。那么就对项目的性能产生影响
1.1.3、字段缓存
当每次实例化对象时TP不会再去分析表结构。而是直接去读取”缓存”(读文件)中的内容
①开启TP的字段缓存功能
②查看第一次效果
③第二次效果
④查看缓存文件
解释:当开启字段缓存功能时。第一次实例化模型对象需要去读取数据表的结构信息。但是目前文件不存在,先读取数据库然后将结果写入到文件中。当第二次实例化对象时由于文件已经存在直接读取即可
更新缓存
注意:在调试模式下虽然有对应的字段缓存的文件存在。但是也不会使用
1.2、字段定义
对于字段缓存功能将信息存在文件中。文件读取受到磁盘的IO性能影响。磁盘相对于内存效率明显低。为了效率可以将数据表的结果信息保存到变量中(内存)。TP提供了一个变量$fileds容许定义数据表的结构信息。Tp会自动的载入该变量
1.2.1、实现字段定义
①定义字段信息
②创建测试方法
③结果
1.2.2、案例数据写入
①创建方法
②访问测试
③修改表结构
④再次写入数据
结果如下
对于上述问题的原因是因为修改了数据表结构。但是在属性中的自定义的字段信息没有变化。没有修改导致数据永远不能正常操作到。
注意:修改表结构之后一定要修改字段信息
⑤修改属性
结果如下
注意:字段缓存不论怎么实例化只要开启都会使用。字段定义只针对使用D实例化方式
1.3、数据创建
当进行数据提交入库时需要每一个要入库的字段需要逐个接受。对于此方式操作特别麻烦。此时可以使用模型提供的数据创建功能方便接受数据并且对数据进行安全的验证
①创建表单
②创建方法
结果可以正常接受但是麻烦并且缺少安全验证
③使用数据创建
④查看结果
修改前台的html
结果如下
对于使用create数据创建默认情况下只能处理post表单提交的数据。如果表单提交为GET默认就不支持
1.4、自动验证(重点)
就目前使用create方法能够简单的验证数据(通过根据数据表的字段信息过滤无用的字段)。但是还不能满足要求。需要针对每一个字段的格式都进行验证。
- 可以使用最原始的方式的逐个校验
- 使用TP所提供的自动验证功能
1.4.1、验证方式
TP所提供的自动验证方式有两种:分别为静态方式跟动态方式。对于两种方式都需要编写验证规则
1.4.2、验证规则
验证字段:需要进行验证的字段名称(对应数据表中的字段)。对于其他特殊(数据表中无字段但是需要验证)的可以使用表单名称
验证规则:与附加规则配合使用。附加规则指定一个大的验证方式。验证规则在附加规则的基础上在指定更为精确的验证规则。
如果附加规则为regex验证规则就需要写上具体的正则表达式
如果附加规则为function验证规则就需要写上公共函数名称
如果附加规则为callback验证规则就需要写上当前模型下的方法
错误提示:当验证不通过提示个用户的信息
验证条件:设置用户的提交的内容存在与否 是否进行判断
附加规则:指定验证使用哪一种方式进行验证
验证时间:指定什么时间进行验证
关于验证规则在第一维下。每一个元素就是一条验证规则。如果针对一个内容需要有多个验证规则可以写多条
1.4.3、静态方式进行验证-正则
①创建验证规则
②查看效果
③不填写内容时的提交
④修改代码获取提示内容
效果如下
⑤关于系统支持的正则表达式
对于使用正则验证。对于第二个参数如果不使用系统内置的正则表达式可以自己编写正则
1.4.3、静态方式验证-函数
函数可以使用php内置的已经TP中定的公共函数
①定义验证规则
②创建自定义的公共函数
③查看效果
1.4.4、静态方式验证-方法
①增加验证规则
②增加方法
③效果
1.4.5、使用动态方式进行验证
①注释静态的方式验证
②创建测试方法显示模板并且提交验证
1.5、字段映射
在实际处理表单提交时,在每一个文本框中需要设置表单名称。对于表单名称一般都是使用数据表的字段名称。此方式存在安全隐患。暴露了数据表的字段信息。可以通过使用字段映射功能隐藏真实数据表的字段名称
①增加自定义字段映射
②创建方法
③创建模板
1.6、自动完成
在使用create时自动处理数据。例如有addtime字段需要记录写入时间。可以通过自动完成当create创建数据之后。会自动的增加对应的内容
1.6.1、自动完成规则
完成字段:填写具体的字段名称即可
完成规则:与附加规则配合使用。附加规则指定具体完成方式。完成规则在附加规则的基础上再次确认使用哪种更为准确的方式进行处理
当附加规则为function 完成规则需要写上函数名称
当附加规则为callback完成规则需要写上当前模型下的方法名称
完成条件:规定使用规则的时间
附加规则:指定自动完成方式
1.6.2、自动完成案例
①修改表结果
②修改自定义的字段信息
③创建自动完成规则
④查看效果
自动完成帮助自动增加或者修改数据的
1.7、特殊表操作
一般模型名称跟数据表的名称保持一致的。但是部分业务场景可能数据表的名称比较奇怪。对此情况可以使用模型中提供的属性tableName跟trueTbaleName控制操作的数据表
1.7.1、tableName
指定表的名称不包括表前缀。表前缀会自动的补上
①复制数据表
②在模型中定义表的名称
③修改方法实现数据写入
④查看效果
1.7.2、trueTableName
真实表名称
①复制数据表
②指定模型对应的真实表名称
③数据写入
1.7.3、connection指定连接的数据库
①修改模板连接的数据库
由于配置项中存在tp_shop数据库的配置。Connection对应的值跟M函数的第三个参数是一致
②在tp5_shop下创建数据表
③测试
从目前所知模型名称不一定要跟数据表的名称绝对保持一致。但是一般都会使用同名
1.8、连贯操作(重点)
对于目前数据的CURD操作只能进行简单的操作。当需要设计复杂的SQL语句操作可以使用连贯操作中提供的方法。常用的where、limit、order、page。
对于连贯方法使用:模型对象->连贯方法->curd方法
在使用连贯方法的过程中没有任何的优先顺序
1.8.1、where使用
Where的作用指定具体的sql语句中的where条件
①where字符串参数的格式
结果如下
②where数组参数的格式
③where预处理
④where指定like查询
1.8.2、field指定字段信息
一般查询数据尽量不要使用*,而是指定字段。需要哪些字段就指定哪些
结果如下
1.8.3、limit限制条数
作用限制sql语句中limit条目数、可以实现分页功能
①传递一个数字参数
②传递字符串的参数
对于此方式可以实现分页功能
1.8.4、page分页
Page也是用于限制条数。也可以用于分页。但是在使用分页时page方法不需要进行运算。直接传递页码即可
1.8.5、Order排序
1.9、模型中的钩子函数
当进行数据的增删改查操作时。如果有定义对应的钩子函数。会自动的进行。对于钩子函数可以实现格式化处理或者是去处理其他的业务逻辑。
增加:_before_insert前置钩子函数 _after_insert后置钩子函数
删除:_before_delete前置钩子函数 _after_delete后置钩子函数
修改:_before_update前置钩子函数 _after_update后置钩子函数
查询:_after_select后置钩子函数
1.9.1、添加的前置钩子函数
①创建方法
②创建前置的钩子函数
③查看效果
1.9.2、后置钩子函数
1.9、trace工具使用
Trace工具可以帮助分析整个框架执行流程以及对项目进行性能的分析
①开启trace工具
②查看效果
会发现右下角有一个小图标,可以点击查看具体的情况