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的特殊设置
Oct 09 PHP
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
php自动加载autoload机制示例分享
Feb 20 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
php获取远程文件大小
Oct 20 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
Jan 21 PHP
PHP实现的简单AES加密解密算法实例
May 29 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
解决laravel中日志权限莫名变成了root的问题
Oct 17 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
js replace正则表达式应用案例讲解
2013/01/17 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python标准库shutil用法实例详解
2018/08/13 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
创先争优活动方案
2014/02/12 职场文书
文化建设工作方案
2014/05/12 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
国庆宣传标语
2014/06/30 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2016教师节感恩话语
2015/12/09 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python