thinkphp5 Model 功能总结
简介
- tp5的model只做业务层操作,不做具体的链接数据库sql操作。
- think\db\Connection.php做链接数据库操作
- think\db\Builder.php做创建sql操作
- think\db\Query.php做数据CURD操作
功能清单
- 数据自动完成
- 自动写入时间戳
- 时间字段自动格式化输出字段
- 字段验证器
- 自动关联写入
- 只读字段
- 隐藏字段
- 事件回调
- 软删除
- 类型转换
功能详情
1. 数据自动完成
- 在model中设置完auto字段后在更新或新增的时候首先会判断auto中设置的字段是否存在于被更新的字段($this->change)中
- 如果存在则不用auto里设置的字段和值
- 如果不存在则将auto里设置的字段和值添加到this−>data中并把该字段新增到this->change中。
- 如果auto是索引数组,也就是只设置了字段名,没有设置子字段值,这是就会根据字段名去$this->data中查询该字段值,并添加的到要更新的属性数组中去。
- 新增数据的方法是create, 修改数据的方法是update,批量新增和修改的方法是saveAll,这几个方法的最终实现都是调用的save方法
- saveAll方法批量新增和修改,并不是组合sql语句,而是开启事务,然后调用save方法,一条一条添加和修改,最后提交事务。
- 在更新操作中,model会自动检查data的所有字段的值是否被更改,只会跟新被更改过得字段的值。没被更改的则被忽略。
- insert、update的功能和auto的功能类似,只不过auto是不管是新增数据和是更新数据都会使用,而insert值针对新增,update只针对更新。如果设置了相同的属性,insert和update的则会覆盖auto中的字段。
2. 自动写入时间戳
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
配置方式
- 该配置TP5默认为false,需要手动开启
- 在数据库配置(database.php)中添加全局配置。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 在单独的模型类里设置
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 知识的字段类型 timestamp/datetime/int
- 如果自己的数据字段不是默认值得话,可以在自己的model里修改。
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 如果只需要createTime而不需要updateTIme,则可以在model中关闭updateTIme
- 1
- 2
- 3
- 1
- 2
- 3
- 在model中开启和关闭只针对单独的model起作用,想要全局起作用还是要在配置文件里配置。
3. 时间字段自动格式化输出
- 1
- 2
- 3
- 1
- 2
- 3
配置方式
- 该配置TP5模式输出格式为 ‘Y-m-d H:i:s’
- 可以自己在数据库配置文件(database.php)中配置。如
- 1
- 2
- 1
- 2
- 也可以在model中设置
- 1
- 2
- 1
- 2
4. 字段验证器
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
使用方式
- 在model中配置字段验证规则,在整个model中新增和更新操作都通用。
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 在具体操作时调用think\Validate类来实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
对比
- 使用第一种方法在model里设置验证规则,虽然说结构看着比较合理,但是这种方法灵活性比较低,
- 因为他是在save的时候去判断的,如果save失败,你不清楚是数据验证失败,还是说插入到数据失败。
- 所以对于做提示验证很麻烦(因为数据验证的提示我们是直接返回给用户的,而数据库操作的提示一般我们是不返回给用户的,
- 所以得到结果后还要做判断,先对比较麻烦)。
- 使用第二种方法在action里定义一个_validate的函数,专门用来做数据校验,这中方法比较灵活,
- 而且他是在在保存数据之前做的校验,所以返回结果分的比较清楚,对用户的提示也比较清晰,代码可读性也比较好。
5. 自动关联写入
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
暂时没有使用,后续再继续不补充。
6. 只读字段
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
7. 隐藏字段
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
当使用toArray和subToArray获得数组数据时,使用hidden字段和hidden函数可以隐藏数组中的元素。如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
8. 事件回调
支持的回调事件
- before_insert 新增前
- after_insert 新增后
- before_update 更新前
- after_update 更新后
- before_write 写入前(新增和更新都会调用)
- after_write 写入后(新增和更新都会调用)
- before_delete 删除前
- after_delete 删除后
注册的回调方法支持传入一个参数,当前示例模型对象,并且before_write,before_insert,before_update,before_delete返回false会结束执行。
使用方法
- 控制器里使用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 模型里使用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
原理
model类里有一个protected static $event = [];属性,注册的时间都存放在这个属性中。比如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注册事件时,把所有的事件都保存在$event中了,然后在insert,update,delete等相应的位置调用即可。
9. 软删除
简介
在实际项目中,对数据频繁的使用删除操作可能会导致性能问题,软删除的作用就是给数据加上删除标记,而不是真正的删除,同时也便于需要的时候恢复数据。
设置方式
使用软删除功能需要引用SoftDelete trait;如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
dateteTIme属性用于标记数据表里的软删除字段,TP5里的软删除使用的是int类型,默认值为null(这个很重要,因为查询的时候是用delete_time is not null 来查询的),用于记录删除时间。
可以用类型转换指定软删除的字段类型,建议数据表里的所有时间字段使用同一种数据类型。
使用方式
在model中设置好后,就可以直接使用了
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
默认情况下,查询出来的数据是不包括软删除的数据的,如果想要查询包括软删除的数据,可以使用下面的方式。
- 1
- 2
- 3
- 1
- 2
- 3
如果仅需要查询软删除的数据,可以这样:
- 1
- 2
- 3
- 1
- 2
- 3
10. 类型转换
TP5支持给数据表中的字段设置类型,并会在读取和写入的时候自动转换。如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
使用示例
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
注意: 如果制定为时间戳类型(timestamp)的话,该字段会在写入的时候自动调用strtotime函数生成对应的时间戳,
输出是自动使用dateFormat格式化时间戳,默认格式为Y:m:d H:i:s,如果想要改变输出格式,可以如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
或者如下:
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭