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分页显示制作详细讲解
Dec 05 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
PHP下常用正则表达式整理
Oct 26 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
php项目中类的自动加载实例讲解
Sep 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中去除所有js,html,css代码
2010/10/12 PHP
学习php中的正则表达式
2014/08/17 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
python设计模式大全
2016/06/27 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python实现支付宝转账接口
2019/05/07 Python
详解Python的三种拷贝方式
2020/02/11 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
百思买美国官网:Best Buy
2016/07/28 全球购物
数控技术应届生求职信
2013/11/13 职场文书
2014和解协议书范文
2014/09/15 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python