1. 模型的定义
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义Model。
基本语法:模型类名称(表名去前缀,首字母大写)Model.class.php
2. 实例化模型类
3. 数据库配置
4. CURD操作
(1)数据写入add()
(2)数据读取find()、select()
(3)数据更新save()
(4)数据删除delete()
5. 定义字段
(1)存在问题
无论我们初始化自定义模型还是系统模型,系统都会自动连接数据库,并检索相关信息,但是这样会增加数据库服务器的开销,如何解决呢?
(2)字段缓存
①只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。
②字段缓存保存在Runtime/Data/_fields/目录下面
当我们第二次运行时,系统自动调用缓存文件,如下图所示
可以通过设置DB_FIELDS_CACHE参数来关闭字段自动缓存
当我们设置以上参数为false,每次初始化模型类都会自动解析数据库
注:实际开发中,由于数据中的字段经常发生变化,所以可以关闭字段缓存。
以上解决办法可以解决数据库服务器的开销,但是由于需要读取字段缓存文件,所以会造成服务器的I/O开销,如何解决呢?
③字段缓存
可以在自定义模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可。
注:由于我们的字段缓存是写在自定义模型中,所以只能通过实例化自定义模型才可以使用字段缓存。
6. 创建数据create()
(1)存在问题
在实际项目开发中,可能会有多个表单(信用卡申请、银行结算),这样会遇到一个问题,我们难道需要一个一个表单进行接收么?
(2)解决方法
ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。
(3)源码分析(create)
。
。
。
调用我们系统调用create方法时,当整个流程运行完毕后,系统会将传递过来的值复制到$this->data属性中,并把接收数据作为$data返回。
(4)安全漏洞问题
①篡改表单
②如何解决?(在模型里面增加一个$insertFields 属性)
或者
③修改Controller里面的create方法的参数
(5)I方法使用
I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'],['额外数据源']);
注意:
变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
例:echo I('get.page',1);相当于isset($_GET['page'])?$_GET['page']:1
7. 字段映射
(1)存在问题
通过create方法我们可以很容易的接收到表单传递过来的数据,要求表单元素名要与数据库中表字段信息一一对应,但是这样容易暴漏我们数据库中的表结构。
(2)解决方法
①更改表单元素名称
②设置自定义模型CategoryModel.class.php,添加$_map属性
③添加结果
④应用场景:主要用于隐藏数据库中的表的结构信息
8. 表名操作
9. 事务处理
事务处理流程:开启事务-提交事务-事务回滚
数据引擎必须采用InnoDB
10. AR操作模式
表映射到类
字段映射到属性
记录映射到对象
(1)增加操作
(2)删除操作
(3)更新操作
(4)查询操作
(5)连贯操作
where:查询条件 类似MySQL语句的where子句
order:排序
limit:限制条件
field:查询的字段 select title,description,content from
group:分组查询
find:查询数据,返回一维数组
select:查询数据,返回二维数据
find与select方法必须连贯操作的最后端
field相关操作
(6)统计操作
count:统计所有记录
max:统计最大值
min:统计最小值
avg:统计平均数
sum:汇总(求和)