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模拟SQL Server的两个日期处理函数
Oct 09 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
Apr 20 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php实现简单文件下载的方法
2015/01/30 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
vue实现表格过滤功能
2019/09/27 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
使用python解析xml成对应的html示例分享
2014/04/02 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Django多数据库的实现过程详解
2019/08/01 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python re.match()用法相关示例
2021/01/27 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
类的返射机制中的包及核心类
2016/09/12 面试题
工作业绩不及格检讨书
2014/10/28 职场文书
2015年导购员工作总结
2015/04/25 职场文书
2016年寒假家长评语
2015/10/10 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python