abstract:一.模型的获取器: 就是在获取模型实例数据时自动触发的模型方法. getFieldAttr($value,$data可选) 1.在模型文件中创建一个获取器方法 对应着一条数据的一个字段. getData()获取某一字段的原始数据(获取器处理之前的) 如获取staff表中的
一.模型的获取器: 就是在获取模型实例数据时自动触发的模型方法. getFieldAttr($value,$data可选)
1.在模型文件中创建一个获取器方法 对应着一条数据的一个字段. getData()获取某一字段的原始数据(获取器处理之前的)
如获取staff表中的name字段,则在模型文件Staff.php中创建受保护的方法 getNameAttr($value,$data可选)方法 $value为获取字段的值 $data为这条查询数据的其他字段值 ,具体操作如下
protected function getSalaryAttr($value, $data) //当获取salary工资字段时自动触发 { return $data['name'].'的工资是:'.($value+250); //获取工资字段返回的值 } /********************************************************************************/ //控制器中方法 public function gain() { $res = Staff::get(2); // dump($res); echo '<hr>'; echo $res->salary,'<br>'; echo $res->getData('salary'); //获取某一字段的原始值 }
2.也可以为获取不存在的字段时进行设置,如下
protected function getStaffInfoAttr($value,$data) //获取不存在的字段staff_info { //staff_info;虚拟字段 //$value: 仅仅是一个占位符 return '我是'.$data['name'].'今年都'.$data['age'].'岁了,工资才'.$data['salary'].'好可怜啊'; } //控制器中方法 echo $res->staff_info,'<br>';
------------------------------------------------------------------------------------------------------------
二.模型修改器:就是在更新模型实例数据时自动触发的模型方法. setFieldAttr($value,$date可选)
1.和获取器几乎相同,就是在更新数据时自动触发
protected function setSalaryAttr($value,$data) //更新salary字段时自动触发 { return $value+$data['age']; //返回处理后的数据 } //控制器中方法 $res = Staff::get(3); $res->salary = '4000'; $res->save(); /********************************************************************************/
三.模型的自动完成 : 针对写操作,当更新,新增(删除通过软删除,也属于更新) 相当于给字段设置默认值
1.设置三个继承于think\Model类中的三个受保护的属性 $insert [新增时设置], $update [更新时设置], 或者$auto [更新或者新增时都设置]
protected $insert = ['sex'=>0,'salary'=>1000]; //新增 protected $update = ['sex'=>0]; //更新 protected $auto = ['sex'=>0]; //新增和更新都设置 //控制器中方法 Staff::create(['name'=>'小灭绝','age'=>60]); Staff::update(['name'=>'灭绝师太','age'=>24], function($query){ $query->where('staff_id = 33'); });
2.类型转换:默认字段转为string类型输出,可以设置$type进行设置类型转换如:
protected $type = [ 'staff_id' => 'integer', 'sex' => 'integer', 'age' => 'integer', 'salary'=> 'integer' ];
四.自动时间戳功能:可以当进行新增和修改是自动将时间戳写入指定的字段中
可以在database.php中进行修改 'auto_timestamp' => false, 这样设置就是全局配置 不推荐这么修改
也可以在数据表对应的模型文件中进行设置三个父类受保护的属性 $autoWriteTimestamp 是否开启自动时间戳 $createTime 创建文件的时间戳字段名 $updateTime 修改文件的时间戳字段名
//开启当前模型的自动时间戳功能 protected $autoWriteTimestamp = true; //设置一下用户自定义的新增和更新时间的字段名 protected $createTime = 'create_time'; protected $updateTime = 'update_time';
五.验证器: 就是创建一个验证器类来进行验证,验证器类继承于think\Validate.php 功能就是对指定数据进行数据验证
1.创建一个验证器类,继承于think\Validate.php ,并写入对应要验证的字段的验证规则
2.自定义验证错误信息,可以更友好的输出错误信息
如下
namespace app\validate; use think\Validate; class Staff extends Validate { //验证规则 protected $rule = [ 'name' => 'require|length:4,15', 'sex' => 'in:0,1', 'age' => 'require|between:18,60', 'salary'=>'require|gt:1500' ]; //自定义错误信息 protected $message = [ 'name.require' => '员工姓名不能为空', 'name.length' => '员工姓名长度不在范围内(4-15字符之间)', 'sex.in' => '性别必须是男或女', 'age.require' => '年龄不能为空', 'age.between' => '年龄必须在18-60之间', 'salary.require'=> '工资必须输入', 'salary.gt' => '工资必须大于1500', ]; }
3.控制器文件:需要引入创建的验证器类; 依赖注入验证器类,调用验证器类check("验证的数据")方法 来进行验证 验证通过返回true 失败返回false getError()方法返回对应的错误信息
namespace app\index\controller; use think\Controller; use app\validate\Staff; //导入验证器类 class Verify extends Controller { //验证器 public function demo1(Staff $validate) //依赖注入 { //准备一下要验证的数据 $data = [ 'name'=> '罗伯特唐尼', 'sex' => 1, 'age' => 22, 'salary' => 5000 ]; // $validate = new Staff(); if(!$validate->check($data)){ dump($validate->getError()); }else{ return '验证通过'; } }
4.可以简化验证器 控制器调用父类Controller.php的方法validate($data,$rule,$message) $data:要验证的数据,$rule:验证规则,$message:错误信息 $this->validate($data,$rule)错误返回错误信息 正确返回true
public function demo2() { $data = [ 'name'=> '钢铁侠罗伯特唐尼', 'sex' => 1, 'age' => 18, 'salary' => 5000 ]; //验证规则 $rule = 'app\validate\Staff'; //验证器类 $res = $this->validate($data,$rule); if($res !== true){ return $res; }else{ return '验证成功!'; } }
5.当想处理很简单的验证规则时可以直接写入validate的参数中
$data = ['age'=>28]; $rule = ['age' => ['between:10,50','require']]; $message = ['age.between' => '年龄必须在10-50之间','age.require' => '年龄不能为空']; $res = $this->validate($data, $rule, $message); //直接传入数据,规则,错误信息 if($res !== true){ return $res; }else{ return '验证成功!'; }
六.独立验证:就是不依赖自定义的验证类,直接引入使用think\Validate.php中的方法进行验证 Validate::make($rule,$message) 创建验证规则并返回验证对象, 验证对象->check($data)即可进行验证
use think\Validate;
public function demo3() { //1.创建验证规则 $rule = ['age'=>'require|between:20,80']; //2.创建错误信息 $mess = [ 'age.require' => '年龄必须填写', 'age.between' => '年龄必须在20-80之间', ]; //3.创建数据 $data = ['age' => 50]; //Validate::make():创建验证规则并返回验证对象 $validate = Validate::make($rule,$mess); //4.进行验证 $res = $validate->check($data); return $res ? '验证成功' : $validate->getError(); }
Correcting teacher:韦小宝Correction time:2018-12-17 16:27:24
Teacher's summary:写的很不错哦!总结的也很完整!框架中的验证可以帮助我们快速的完整项目!