模型自动操作与数据验证

原创 2018-11-25 19:27:44 758
摘要:主要学习了模型获取器/修改器/类型转换与自动完成/自动时间戳/验证器及独立验证。一、获取器/修改器/类型转换与自动完成/自动时间戳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
老师总结:作业 非常 完整, 模型中, 获取器和设置器,通常要与自动完成属性配对使用,要注意

发布手记

热门词条