摘要:主要学习了模型获取器/修改器/类型转换与自动完成/自动时间戳/验证器及独立验证。一、获取器/修改器/类型转换与自动完成/自动时间戳get Attr是固定的,只能改成中间的字段名,而且首字母要大写;getShowAttrclass Staff extends Model { //获取器1: show字段,仅限模型内部调用,不能是public pro
主要学习了模型获取器/修改器/类型转换与自动完成/自动时间戳/验证器及独立验证。
一、获取器/修改器/类型转换与自动完成/自动时间戳
get Attr是固定的,只能改成中间的字段名,而且首字母要大写;getShowAttr
class Staff extends Model
{
//获取器1: show字段,仅限模型内部调用,不能是public
protected function getShowAttr($value) //get Attr是固定的,只能改成中间的字段名,而且首字母要大写
{ $show = [0=>'隐藏', 1=>'显示'];
return $show[$value];
}
//获取器2: 可传入所有字段的值,用来更加完整的描述用户字段信息
protected function getShuziAttr($value, $data)
{
return $data['namecn'].'的排序是:'.($value+200); //$data里面的必须是字段名 生成用户订单是常用
}
//获取器3: 可以为表中不存在的字段设置获取器方法,纯粹为了拼装字段内容
protected function getStaffInfoAttr($value, $data)
{
//其实$value此时仅是一个占位符,可任意命名,无任何意义
return '栏目'.$data['namecn'].'排序.'.$data['show'].',设置的数值'.$data['shuzi'].'~~';
}
//修改器1:注意驼峰命名 entry_time: setEntryTimeAttr
protected function setuptimeAttr($value)
{
return strtotime($value);
}
//修改器2:也支持传入第二个参数,引用其它字段的值
protected function setOrderidAttr($value, $data)
{
//salary字段存入表中时,自动加上员工的年龄,纯粹演示,无实际意义
return $value+$data['orderid'];
}
//类型转换
//思考:为什么name字段不需要转换
//因为从表中取出的数据默认都是字符型,name本身就是字符型,所以不用转换
protected $type = [
'orderid' => 'integer',
'show' => 'integer',
'zhuzi' => 'interger'
];
//自动完成,针对的是新增和更新,删除已经使用软删除操作了,查询上面已经有几个获取器了
//相当于设置默认值
//模型设置的默认值比数据库中设置的默认值要优先
protected $insert = ['show' => 1,'orderid'=> 10,'delete_time'=>0]; //新增时
protected $update = ['show'=> 0];//更新
// protected $auto = ['show'=>0]; //针对新增和更新,可以设置一个总的。这个设置了之后,单独的新增和更新可以不用再设置
//开启当前模型的自动时间戳功能(也可以使用全局的设置,不建议使用)
protected $autoWriteTimestamp = ture;
//设置一下用户自定义的新增和更新的字段名
protected $createTime ='add_time';
protected $updateTime ='up_time';
}<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Staff;
class ModelEdu extends Controller
{
//获取器
public function gain()
{
$res = Staff::get(19); //实例并初始化Staff模型
//\var_dump($res); //查看所有字段信息
echo $res->show, '<br>'; //查看经过修改器处理后的显示字段 必须是字段名
echo $res->getData('show'), '<br>'; //查看原始字段值
echo $res->shuzi, '<br>'; ////getShuziAttr 查看经过修改器处理后的工资字段(为了保密加了200,非真实工资)
echo $res->staff_info, '<br>'; //查看一个不存在的字段信息,体验获取器的强大之处
}
//修改器: 先给staff表新增一个字段uptime entry_time: setEntryTimeAttr 注意驼峰命名
public function modify()
{
$res = Staff::get(19);
$res->uptime = '2018-11-25'; //setuptimeAttr
$res->save();
return '修改成功';
$res = Staff::get(19);
$res->orderid = 18;
$res->save();
return '修改成功';
}
//自动完成:
public function auto()
{
//Staff::create(['namecn'=>'新增自动完成','introctioncn'=>'新增']);
Staff::update(['namecn'=>'更新自动完成','introctioncn'=>'更新'],['id'=>39]);
}
}
?>二、验证器与独立验证
<?php
namespace app\validate;
use think\Validate;
class Staff extends Validate
{
//创建验证规则
//以属性的方式进行配置,属性不能更改
protected $rule = [
'namecn' => 'require|min:2|max:15',//require 是必填
'show' => 'in:0,1',
'orderid' => 'require|between:0,60', //between区间
'zhuzi' => 'require|gt: 1500' //必须大于
];
// 错误信息可以自定义:message 是固定的,不能随意更改。每个错误信息都要设置
protected $message = [
'namecn.require' => '标题不能为空',
'namecn.min' => '标题不能少于2个字符',
'namecn.max' => '标题不能大于15个字符',
'show.in' => '显示属性只能选择显示或隐藏',
'orderid.require' => '排序必须输入',
'orderid.between' => '排序必须在0到60之间',
'zhuzi.require' => '数值必须输入',
'zhuzi.gt' => '数值必须大于1500元'
];
}<?php
namespace app\index\controller;
use think\Controller;
use app\validate\Staff; //导入验证器
use think\Validate; //独立验证
class Verify extends Controller
{
//验证器,直接实例化验证器完成验证
public function demo1()
{
//准备要验证的数据
$data = [
// 'name'=>'zhu',
'namecn'=>'数据验证',
'show' => 1,
'orderid' => 8,
'zhuzi' => 8200
];
$validate = new Staff();
if (!$validate->check($data)) {
dump($validate->getError());
} else {
return '验证通过';
}
}
//验证器: 使用控制器内容的验证对象来完成验证: $this->validate($data, $rule)
public function demo2()
{
//准备要验证的数据
$data = [
'namecn'=>'数据验证',
'show' => 1,
'orderid' => 8,
'zhuzi' => 1800
];
$rule = 'app\validate\Staff';
$res = $this->validate($data,$rule);
if (true !== $res) { //验证成功返回true,否则返回错误信息
return $res;
}
return '验证成功';
}
//直接验证,不需要验证器
public function demo3()
{
$data = ['orderid'=>10];
$rule = [ 'orderid' => 'between:10,50'];
$mess = [
'orderid.between' => '排序必须在10到50之间'
];
$res = $this->validate($data,$rule,$mess);
if (true !== $res) { //验证成功返回true,否则返回错误信息
return $res;
}
return '验证成功';
}
//独立验证: 直接实例化think\Validate.php进行验证
public function demo4()
{
//think\Validate.php
//主要是通过Validate::make()和check()进行验证
//make($rule,$mess):创建验证规则并返回验证对象与错误信息
//check($data)完成数据验证
//1.创建验证规则
$rule = [
'orderid' => 'require|between:10,50'
];
//2.创建错误信息
$mess = [
'orderid.require' => '排序必须填写',
'orderid.between' => '排序必须在10到50之间'
];
//3.创建验证数据
$data = ['orderid' => 3];
//初始化验证器类,并返回验证器实例
$validate = Validate::make($rule, $mess);
$res = $validate->check($data);
return $res ? '验证通过' : $validate->getError();
}
}
批改老师:天蓬老师批改时间:2018-11-25 19:37:04
老师总结:作业 非常 完整, 模型中, 获取器和设置器,通常要与自动完成属性配对使用,要注意