热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP3.1快速入门(13)自动完成

自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理。
自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理。
因此,在ThinkPHP使用create方法来创建数据对象是更加安全的方式,而不是直接通过add或者save方法实现数据写入。

规则定义

自动完成通常用来完成默认字段写入,安全字段过滤以及业务逻辑的自动处理等,和自动验证的定义方式类似,自动完成的定义也支持静态定义和动态定义两种方式。
静态方式:在模型类里面通过$_auto属性定义处理规则。
动态方式:使用模型类的auto方法动态创建自动处理规则。
两种方式的定义规则都采用:
  1. array(
  2.     array(完成字段1,完成规则,[完成条件,附加规则]),
  3.     array(完成字段2,完成规则,[完成条件,附加规则]),
  4.     ......
  5. );
说明
完成字段:(必须)需要进行处理的数据表实际字段名称。
完成规则:(必须)需要处理的规则,配合附加规则完成。
完成时间:(可选)包括:
Model:: MODEL_INSERT或者1 新增数据的时候处理(默认)
Model:: MODEL_UPDATE或者2更新数据的时候处理
Model:: MODEL_BOTH或者3所有情况都进行处理
附加规则:(可选)包括:
function 使用函数,表示填充的内容是一个函数名
callback 回调方法 ,表示填充的内容是一个当前模型的方法
field 用其它字段填充,表示填充的内容是一个其他字段的值
string 字符串(默认方式)
ignore 为空则忽略(3.1.2新增

静态定义

预先在模型类里面定义好自动完成的规则,我们称之为静态定义。例如,我们在模型类定义_auto属性:
  1. class UserModel extends Model{
  2.     protected $_auto = array ( 
  3.         array('status','1'),  // 新增的时候把status字段设置为1
  4.         array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理
  5.         array('name','getName',3,'callback'), // 对name字段在新增和编辑的时候回调getName方法
  6.         array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳
  7.     );
  8. }
然后,就可以在使用create方法创建数据对象的时候自动处理:
  1. $User = D("User"); // 实例化User对象
  2. if (!$User->create()){ // 创建数据对象
  3.     // 如果创建失败 表示验证没有通过 输出错误提示信息
  4.     exit($User->getError());
  5. }else{
  6.     // 验证通过 写入新增数据
  7.     $User->add();
  8. }
如果你没有定义任何自动验证规则的话,则不需要判断create方法的返回值:
  1. $User = D("User"); // 实例化User对象
  2. $User->create(); // 生成数据对象
  3. $User->add(); // 新增用户数据
或者更简单的使用:
  1. $User = D("User"); // 实例化User对象
  2. $User->create()->add(); // 生成数据对象并写入数据
create方法默认情况下是根据表单提交的post数据生成数据对象,我们也可以根据其他的数据源来生成数据对象,你也可以明确指定当前创建的数据对象自动处理的时间是新增还是编辑数据,例如:
  1. $User = D("User"); // 实例化User对象
  2. $userData = getUserData(); // 通过方法获取用户数据
  3. $User->create($userData,2); // 根据userData数据创建数据对象,并指定为更新数据
  4. $User->add();
create方法的第二个参数就用于指定自动完成规则中的完成时间,也就是说create方法的自动处理规则只会处理符合完成时间的自动完成规则。
create方法在创建数据的时候,已经自动过滤了非数据表字段数据信息,因此不需要担心表单会提交其他的非法字段信息而导致数据对象写入出错,甚至还可以自动过滤不希望用户在表单提交的字段信息(详见字段合法性过滤)。

3.1.2版本开始新增了ignore完成规则,这一规则表示某个字段如果留空的话则忽略,通常可用于修改用户资料时候密码的输入,定义如下:
  1. array('password','',2,'ignore'
表示password字段编辑的时候留空则忽略。

动态完成

除了静态定义之外,我们也可以采用动态完成的方式来解决不同的处理规则。
  1. $rules = array ( 
  2.     array('status','1'),  // 新增的时候把status字段设置为1
  3.     array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理
  4.     array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳
  5. );
  6. $User = M('User');
  7. $User->auto($rules)->create()->add();

修改数据对象

在使用create方法创建好数据对象之后,此时的数据对象保存在内存中,因此仍然可以操作数据对象,包括修改或者增加数据对象的值,例如:
  1. $User = D("User"); // 实例化User对象
  2. $User->create(); // 生成数据对象
  3. $User->status = 2// 修改数据对象的status属性
  4. $User->register_time = NOW_TIME// 增加register_time属性
  5. $User->add(); // 新增用户数据
一旦调用了add方法(或者save方法),创建在内存中的数据对象就会失效,如果希望创建好的数据对象在后面的数据处理中再次调用,可以保存数据对象先,例如:
  1. $User = D("User"); // 实例化User对象
  2. $data = $User->create(); // 保存生成的数据对象
  3. $User->add();
不过要记得,如果你修改了内存中的数据对象并不会自动更新保存的数据对象,因此下面的用法是错误的:
  1. $User = D("User"); // 实例化User对象
  2. $data = $User->create(); // 保存生成的数据对象
  3. $User->status = 2// 修改数据对象的status属性
  4. $User->register_time = NOW_TIME// 增加register_time属性
  5. $User->add($data);
上面的代码我们修改了数据对象,但是仍然写入的是之前保存的数据对象,因此对数据对象的更改操作将会无效。

推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
author-avatar
双子汐晨_312
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有