Yii 2中的load()和save()示例详解


Posted in PHP onAugust 03, 2017

前言

本文主要给大家介绍的是关于Yii2中load()和save()的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍吧。

我这里用的数据库是mongo 数据库 为栗子:

public function load($data, $formName = null)
 {
  $scope = $formName === null ? $this->formName() : $formName; //调用load 一般我是 $test = new test() $test->load('参数1','参数2')
// 参数1 一般是post get 传过来的参数 第二个参数 是一个空字符串 '';
//$this->formName() 返回的额是 你实例化的类的名字 new test() 最后返回的是test

  if ($scope === '' && !empty($data)) {
   $this->setAttributes($data);//进入

   return true;
  } elseif (isset($data[$scope])) {
   $this->setAttributes($data[$scope]);

   return true;
  } else {
   return false;
  }
 }

接下来看   setAttributes()

public function setAttributes($values, $safeOnly = true)
 {
  if (is_array($values)) {
   $attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());
//这里执行的是$this->safeAttributes()方法,该方法返回的是当前场景下需要验证的字段。最后$attributes打印下来看下图
foreach ($values as $name => $value) {
 if (isset($attributes[$name])) { 
$this->$name = $value; 
 } elseif ($safeOnly) {
 $this->onUnsafeAttribute($name, $value); 
} } 
 } 
}

图: 图1的文件名是test  实例化后是$test 对象  public function attribues() 方法中对应的就是表字段。

我这里没有用场景  所以暂时不讲解场景这个功能。 不过大家可以看手册。很容易懂。

Yii 2中的load()和save()示例详解Yii 2中的load()和save()示例详解

这两个图是对相应的

在之后 执行的是 foreache循环  这里的$this 是那个$test 这个对象对象去调用

//例如post 提交过来的数据是这样

$post=[

'a'=>123456,

'b'=>'abcdef'

] 

$test->a=123456

$test->b='abcdef'

所以这个load()方法只是分配post  或者get 发过来的数据,不做验证。

接下来看save();

查看save方法 。

public function save($runValidation = true, $attributeNames = null)
 {
  if ($this->getIsNewRecord()) {//判断是否是新纪录
   return $this->insert($runValidation, $attributeNames);//执行这里 之后$this代表的是test 这个模型表。
//test 继承的是\yii\mongodb\ActiveRecord 查看insert() 方法 。
} else {
 return $this->update($runValidation, $attributeNames) !== false; }
 }

insert() 方法中

public function insert($runValidation = true, $attributes = null)
 {
  if ($runValidation && !$this->validate($attributes)) {//下面的代码分析validate方法 验证rules
   return false;
  }
  $result = $this->insertInternal($attributes);//保存数据

  return $result;
 }

首先看

//进行数据验证。
public function validate($attributeNames = null, $clearErrors = true)
 {
  if ($clearErrors) {
   $this->clearErrors();
  }

  if (!$this->beforeValidate()) {//在验证之前首先执行的是 beforValidata 
   return false;
  }

  $scenarios = $this->scenarios();
  $scenario = $this->getScenario();//检查是否调用场景
  if (!isset($scenarios[$scenario])) {
   throw new InvalidParamException("Unknown scenario: $scenario");
  }

  if ($attributeNames === null) {
   $attributeNames = $this->activeAttributes(); //返回数组(值为属性的名称)
  }
//$this->getActiveValidators() 验证数据。 读取rules 方法 getActiveValidators() ->getValidators()->createValidators()这里验证rules等信息->createValidator()
foreach ($this->getActiveValidators() as $validator) { 
$validator->validateAttributes($this, $attributeNames); //获取交集 检查是否有错误 hasError()
 }
 $this->afterValidate();
 return !$this->hasErrors(); }

此时数据验证完毕,之后就保存数据 保存数据这块 就暂时不写了 后续补上。

好了 其中数据验证那一块 大家多看看源码吧。 一遍不行2遍 3遍 多了就懂了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
利用PHP制作简单的内容采集器的代码
Nov 28 PHP
PHP 可阅读随机字符串代码
May 26 PHP
PHP print类函数使用总结
Jun 25 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
Yii2使用表单上传文件的实例代码
Aug 03 #PHP
yii2学习教程之5种内置行为类详解
Aug 03 #PHP
PHP实现的简单在线计算器功能示例
Aug 02 #PHP
利用php操作memcache缓存的基础方法示例
Aug 02 #PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 #PHP
YII框架中使用memcache的方法详解
Aug 02 #PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 #PHP
You might like
PHP数组实例总结与说明
2011/08/23 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
Python里面如何拷贝一个对象
2014/02/17 面试题
重阳节登山活动方案
2014/02/03 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
小学生家长寄语
2014/04/02 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
技术入股协议书
2016/03/22 职场文书
决心书格式及范文
2019/06/24 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL