一、获取器
获取器的作用是对模型实例的(原始)数据做出自动处理,也就是在模型对象进行查询后,对其获取到的数据进行一些自定义的设置,比如将获取到的time字段的值由时间戳自动转换为日期格式等等
1、在模型中定义获取器:
(1) 该方法必须为public修饰的
(2) 方法名为 getFieldNameAttr ,其中FieldName为数据库表字段的驼峰转换
2、自动触发获取器的场景
(1) 模型对象的取值操作,也就是通过对象 $model->字段 的方式来获取值
(2) 模型的序列化输出操作,也就是 $model->toArray() 和 toJson()方法
(3) 直接显示调用getAttr方法, $this->getAttr('field_name');
3、参数
(1) 第一个参数传入的是当前字段的值
(2) 第二个参数传入的是当前的所有数据数组
4、在定义了获取器的情况下获取原始数据
可以使用 $model->getData('字段名') 来获取
5.举例
查询操作:return Examination::where(['id'=>$params['id']]) ->field('start_time') ->findOrEmpty() ->toArray();
此处在执行查询操作时,由于start_time字段在数据库中保存的是时间戳,而查询需要的是日期格式的"2024-6-21 14:50:00",若是不在模型中设置获取器,则要在每个需要获取时间的模块通过函数进行格式转换,而在模型中定义了获取器后,则可以直接通过访问字段,而不需要进行额外的格式转换,省去了重复的格式转换代码
定义获取器:public function getStartTimeAttr($value) { return date('Y-m-d H:i:s', $value); }
二、修改器
修改器则与获取器相反,它的主要作用是对模型设置的数据对象值进行处理,比如在进行数据库添加操作时,传入的start_time的值是期格式的"2024-6-21 14:50:00",而保存到数据库的值是时间戳,这种情况则可以通过修改器来进行设置
1、定义修改器和传入的参数和获取器一样
2、自动触发修改器的场景
(1) 模型对象赋值操作,也就是
Examination::create([ 'start_time' => $params['start_time'], ]);
(2) 调用模型的data
方法,并且第二个参数传入true
;
(3) 调用模型的appendData
方法,并且第二个参数传入true
;
(4) 调用模型的save
方法,并且传入数据;
(5) 显式调用模型的setAttr
方法;
(6) 显式调用模型的setAttrs
方法,效果与appendData
并传入true
的用法相同;
3、举例
Examination::create([ 'start_time' => strtotime($params['start_time']), ]);
在创建对象到数据库时,传入的参数为日期格式的"2024-6-21 14:50:00",但保存到数据库的值是时间戳,这种情况就可以在模型中设置修改器,而不是在create方法中再去添加转换函数,可以直接赋值:
'start_time' => $params['start_time']
定义修改器:public function setStartTimeAttr($value) { return strtotime($value); }
总结:
获取器:在从数据库中取出数据,并将其展示给用户之前,可以对模型的属性进行格式化或处理
修改器:在将数据保存到数据库之前,可以对模型的属性进行格式化或处理