一、创建模型
1. 编程方式: application/index/model/Staff.php
2. 命令方式:
(1)切换think命令所在目录下;
(1)运行: php think make:model index/Staff,自动创建index/model/Staff.php,如果没有
model目录,则自动创建;
(2)运行: php think make:model Staff,如果省略模块名,默认为common模块,
模型位于:application/common/model/Staff.php,common模块如果不存在也会自动创建;
3. 默认情况下:Staff模型与数据表staff对应
--------------------------------------------------------------------------------
二、调用模型
use app\index\model\Staff;
1. 实例化调用: $staff = new Staff();
2. 静态查询调用: $staff = Staff::get();
3. 助手函数调用: $staff = model('Staff');
不推荐用助手函数,因为model()无法调用模型静态方法
一、Db与模型的区别与联系?
1.Db和模型的职责和定位不同;
2.Db负责的只是数据(表)访问;
3.模型是业务数据和业务逻辑的完美封装;
4.Db是模型的基础,模型最终实现依赖Db实现;
5.重点来了:Db返回是数组,模型返回的是对象
可能同学们一时对这些描述不是很理解,相信随着学习的深入和开发经验的积累,会对模型有更深的理解。
--------------------------------------------------------------------------------
二、模型与数据表之间的关系
1.模型本质是一个类,继承自框架的think\Model.php类;
2.模型大多与一张数据表对应,但并不总是这样;
3.模型支持ORM(对象关系映射);
4.模型对应数据表,而模型实例(对象)对应表中的一条记录
5.模型支持更多的业务处理功能:自动完成,自动转换,自动验证等等,这是Db不具备的
--------------------------------------------------------------------------------
三、关于Db与模型的几个误区
1.认为模型效率不如直接操作Db,其实这点差别相对模型的便利性,简直可以直接忽略;
2.认为为每张数据表创建模型无意义,还麻烦,其实这是不对的,通过模型操作数据其实更加的安全可靠;
3.认为模型的操作不容易掌握,概念不容易理解,恰恰相反,模型相对Db更加的人性,也更贴近开发需求;
--------------------------------------------------------------------------------
四、模型的优势
1.可以更优雅的操作数据,完全面向对象编程;
2.可以更加的直观的实现多表的关联操作;
3.可以最大限度的保证用户数据的安全性和完整性;
4.可以非常方便的扩充业务逻辑功能;
5.可以极大的减少控制器中的业务逻辑代码.
--------------------------------------------------------------------------------
五、改进要求
1.如果模型中写了很少的代码,甚至是空模型,那么要检查你的业务规划是不是有了问题
2.如果控制器中写了大量的数据处理代码,那么最好将这些代码移到模型中去统一处理
一、获取器的创建与使用
1.获取是写在模型类中的一个方法
2.当用户通过模型获取表中数据时会自动触发,但也并非绝对如此
3.主要应用场景:用于从数据表中读取数据
(1)时间日期字段的格式化输出;
(2)集合或枚举类型的输出;
(3)数字状态字段的输出;
(4)组合字段的输出
4. 获取器方法命名规则:
get字段名Attr(字段值[,所有字段]),例如 getBirthdayAttr($value)
5. 可以读取不存在的字段信息
--------------------------------------------------------------------------------
二、修改器的创建与使用
1.修改器也是模型类中的一个方法
2.使用场景:
(1)时间日期字段的转换写入;
(2)集合或枚举类型的写入;
(3)数字状态字段的写入;
(4)某个字段涉及其它字段的条件或者组合写入
2.在以下5种情况下会触发修改器工作
(1)模型对象赋值;
(2)调用模型的data方法,并且第二个参数传入true;
(3)调用模型的save方法,并且传入数据;
(4)显式调用模型的setAttr方法;
(5)定义了该字段的自动完成;
--------------------------------------------------------------------------------
三、自动时间戳
1.添加与更新数据时,将时间自动写入到指定字段中
2.可以全局开启,也可以在模型中单独开启
(1)全局设置:config/database.php
// 自动写入时间戳字段
'auto_timestamp' => false, //改为true
如果当前模型中不需要自动时间戳功能,请手动关闭
protected $autoWriteTimestamp = false;
(2)模型设置:
protected $autoWriteTimestamp = true;
**建议在模型中单独开启,这样最灵活,毕竟不是每一张表都需要时间戳字段
3.一旦开启该功能,用户更新或添加数据时会自动将操作时间写入到以下二个字段
(1)新增时间: create_time
(2)更新时间: update_time
以上这二个字段名是默认值,可以在模型中重新定义
4.不需要为这二个字段设置修改器,框架会自动处理
--------------------------------------------------------------------------------
三、类型转换
1.表中取出的数据,默认为字符类型
2.在模型中配置: protected $type = ['字段名' => '类型名称',...]
3.类型中没有字符型,因为它是默认类型,无须转换
--------------------------------------------------------------------------------
四、自动完成
1. 自动完成必须要配合修改器工作;
2. 自动完成是针对写操作: 新增与更新
3. 通过在模型中设置三个属性来配置
4. protected $insert = []; 新增时自动完成
5. protected $update = []; 更新时自动完成
6. protected $auto = []; 新增或更新时自动完成
7. 类似于给表中字段设置默认值