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 相关文章推荐
php foreach、while性能比较
Oct 15 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
phalcon框架使用指南
Feb 23 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
php中array_column函数简单实现方法
Jul 11 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
理清PHP在Linxu下执行时的文件权限方法
Jun 07 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 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
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
教师实习自我鉴定
2013/12/11 职场文书
企业管理部经理岗位职责
2013/12/24 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
加班费申请报告
2015/05/15 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电