Thinkphp3 第2章 模型Model Thinkphp3 第2章 模型Model

2018-02-08

1、Model

① D() 先找当前模块的model。找不到则找common,再次找不到则用M()

② 跨模块继承 D('Admin/User');

③ 原生:$user = M(); $user->query("SELECT * FROM user")

2、字段缓存

① 字段缓存文件生成在Runtime/data/_fields,是永久缓存。

② 'DB_FIELDS_CACHE'=>true //开启字段缓存。如果开启了调试模式,自动关闭

M('user')->getDbFields(); //查看字段结构

③ 手动定义数据表字段的方式,取代字段缓存方式,避免IO开销

class UserModel extends Model{
    //手动定义数据表字段,_pk表示主键
    protected $fields = [
        "id",
    "username",
    "_pk"=>"id",
    //type定义每个字段的类型,可以永远字段验证
    "type"=>["id"=>"smallint","username"=>"varchar"],
    ];
}

3、自动验证

可以在使用create()创建数据对象时进行自动验证

①、验证规则:静态定义_validate属性、动态验证validate()方法

[

[验证字段1,验证规则,错误提示,验证条件,附加规则,验证时间]

];

PS:验证字段、验证规则和错误提示必选

系统内置了常用的规则:require、unique、e

mail、url、currency、number、integer、double、zip(邮政编码)、english。这些默认规则采用的附加规则是正则表达式验证

②、验证条件,有三种

  • self::EXISTS_VALIDATE或0,表示存在字段就验证(默认)

  • self::MUST_VALIDATE或1,表示必须验证

  • self::VALUE_VALIDATE或2,表示值不为空的时候验证

③、附加规则:配合验证规则使用,包括

regex:正则验证,定义的验证规则是一个正则表达式(默认)

["username","/^\d{3,6}$/","不是3-6位纯正数字",0,"regex"]

function:函数验证,定义的验证规则是一个函数名

["username","checkLength","用户名必须3-5位",0,"function",3,[3,5]]

//在common文件下建立function.php会自动加载

function checkLength($str,$min,$max){
    preg_math_all("/./u",$str,$matches);
    $len = count($matches[0]);
    if($len$max){
        return false;
    }else{
        return true;
    }
}

callback:方法验证,定义的验证规则是当前模型类的一个方法

["username","checkLength","用户名必须3-5位",0,"callback",3,[3,5]]
protected function checkLength($str,$min,$max){
    preg_math_all("/./u",$str,$matches);
    $len = count($matches[0]);
    if($len$max){
        return false;
    }else{
        return true;
    }
}

confirm:验证表单中的两个字段是否相同,定义的验证规则是一个字段名

["password","repassword","两次输入的密码不相同",0,"confirm"]

equal:验证是否等于某个值,该值由前面的验证规则定义

["username","鲁鲁槟","值不是鲁鲁槟",0,"equal"]

notequal:验证是否不等于某个值,该值由前面的验证规则定义

["username","鲁鲁槟","值不能等于鲁鲁槟",0,"notequal"]

in:验证是否在某个范围,定义的验证规则可以是一个数组或者逗号分割的字符串

["username",["a","b"],"不在指定范围",0,"in"]

notin:验证是否不在某个范围,定义的验证规则可以是一个数组或者逗号分割的字符串

["username",["a","b"],"不能指定范围内",0,"notin"]

between:验证某个范围,数组或逗号字符串

["username","[2,5]","2-5之间",0,"between"]

notbetween:验证某个范围,数组或逗号字符串

["username","[2,5]","不能在2-5之间",0,"notbetween"]

length:验证长度,定义的验证规则可以是一个数字(表示固定长度)或数字范围(例如3,12表示长度从3到12的范围)

["username","2","长度不得小于2位",0,"length"]
["username","2,5","长度在2-5位之间",0,"length"]

expire:设置有效期范围,必须是表单提交有效,可以是时间戳

["username","2014-1-10,2015-10-10","时间已过期",0,"expire"]

ip_allow:验证ip是否允许,定义的验证规则表示允许的ip列表,用逗号隔开,例如 202.29.08.0,29.90.900.89

["username","127.0.0.1","当前ip没有被允许",0,"ip_allow"]

ip_deny:验证ip是否禁止,定义的验证规则表示禁止的ip列表,用逗号隔开

["username","127.0.0.1","当前ip被禁止",0,"ip_deny"]

unique:验证是否唯一,系统会根据字段查询数据库判断是否存在相同的值,当表单数据中包含主键字段时unique不可用于判断主键字段本身

④、验证时间:主要新增修改等验证

  • self::MODEL_INSERT 或 1,新增数据时验证

  • slef::MODEL_UPDATW 或 2,编辑数据时验证

  • self::MODEL_BOTH 或 3,全部情况下验证(默认)

⑤、错误信息

如果多个字段包含错误,默认只显示一个错误,如果想显示全部错误,可以设置属性:

$proteced $patchValidate = true; //批量验证

如果是post过来的,直接使用create()方法即可:

$user = D("User");
if($user->create()){
    echo "所有数据验证成功";
}else{
    var_dump($user->getError())
}

如果想把错误信息返回给ajax处理,可以用

$this->ajaxReturn($user->getError())

⑥、动态验证:把验证规则放在控制

$rule = [
  ["username","require","用户名不能为空"]
];
$user = M("User");
$data["username"] = "";
if($user->validate($rule)->create($data)){
  echo "所有字段验证成功";
}else{
  var_dump($user->getError())
}

4、自动完成

数据处理——默认字段写入、安全字段过滤、业务逻辑自动处理(密码加密等)

① 两种规则:静态方式——在模型类里通过$_auto属性定义处理规则

动态方式——使用控制器的auto方法动态创建自动处理规则

[

[完成字段1,完成规则,[完成条件,附加规则]]

]

② 完成条件

  • self::MODEL_INSERT 或 1,新增数据时验证(默认)

  • slef::MODEL_UPDATW 或 2,编辑数据时验证

  • self::MODEL_BOTH 或 3,全部情况下验证

③ 附加规则——配合完成规则使用,包括以下规则:

  • function:函数完成,定义的验证规则是一个函数名

  • callback:方法完成,定义的验证规则是当前模型类的一个方法

  • field:用其他字段填充,表示填充的内容是一个其他字段的值

  • string:字符串(默认)

  • ignore:为空则忽略

④ 静态定义

class UserModel extends Model{
    protected $_auto = [
        ["count",1], //自动设置count字段为1
        ["password","sha1",3,"function"],//给密码加密,加密类型为sha1
        ["username","email",3,"field"], //把email字段填充到username字段中
        ["username","updateUser",3,"callback","_"], //callback,给用户名加前缀
        ["password","",2,"ignore"] //用户修改时其他信息时密码留空,密码忽略修改
    ];
    protected function updateUser($str,$prefix){
        return $prefix.$str;
    }
}

⑤ 动态完成

$auto = [
    ["password","sha1",3,"function"]
];
$user = new M("User");
$data["username"] = "鲁鲁槟";
if($user->auto($auto)->create($data)){
    $user->add();
}

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 3005