软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > WEB开发 > PHP >
thinkphp5自动完成操作,两次运行的详解
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2017-09-08 点击:355

本人在用thinphp5初期,在数据自动完成 那里 调了坑 ,所以我在这里注明一下实际的用法与区别,特别是刚来接触,没有来得及看文档的小朋友们!

下面来详细讲一下自动完成与修改器的用法与区别

自动完成

定义:对数据进行插入、更新的时候进行字段的自动完成机制,例如用户在登录、注册时写入登录、注册的ip地址

namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $auto = ['ip'];
    
    protected function setIpAttr()
    {
        return request()->ip();
    }
}

在对数据进行增加或更新的时候,会自动对ip字段进行赋值

注意:字段一定要是数据库里存在的字段

重点:上面的这种情况只是一种需求,还有另外一种就是在插入数据的时候,要对数据进行二次处理,例如把时间字符串转换成时间戳后再进行插入,怎么办? 一般想的是,就在自动完成里面转换就是。。。这就是让你晕的地方,这种情况就必须推荐用”修改器“

修改器

修改器方法的命名规范:

setFieldNameAttr

例如:

class User extends Model 
{
    public function setNameAttr($updatetime)
    {
        return strtotime($updatetime);
    }
}

怎么样,看上面是不是跟自动完成定义的简直没区别,是的,就是一样的,用心的同学就能看到,修改器没有属性字段指定,就是没有说明什么时候调用的字段属性protected......,修改器应用的场景跟触发情况 :

使用场景:

  • 时间日期字段的转换写入;
  • 集合或枚举类型的写入;
  • 数字状态字段的写入;
  • 某个字段涉及其它字段的条件或者组合写入;

触发情况:

  • 模型对象赋值;
  • 调用模型的data方法,并且第二个参数传入true
  • 调用模型的save方法,并且传入数据;
  • 显式调用模型的setAttr方法;
  • 定义了该字段的自动完成;

官方提醒:数据自动完成仍然还是调用的修改器,要注意避免数据被两次处理的可能,自动完成定义的属性不要和表单提交的冲突。

看到了吧,自动完成定义 的属性不要和表单提交的冲突,什么意思?意思就是在进行数据自动完成的字段不要在”自动完成“前进行数据赋值,不然会执行两次自动完成的方法。

总结:

修改器,对数据进行后续处理的一种方式

自动完成,自动对数据进行填充的一种方式

对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈