Yii 2 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() 方法中对应的就是表字段。
我这里没有用场景 所以暂时不讲解场景这个功能。 不过大家可以看手册。很容易懂。


这两个图是对相应的
在之后 执行的是 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遍 多了就懂了。
小弟先总结到这里了
Yii 2 load() 和 save()的更多相关文章
- load、save方法、spark sql的几种数据源
load.save方法的用法 DataFrame usersDF = sqlContext.read().load("hdfs://spark1:9000/users.pa ...
- SparkSQL读写外部数据源-基本操作load和save
数据源-基本操作load和save object BasicTest { def main(args: Array[String]): Unit = { val spark = SparkSessio ...
- 37、数据源之通用的load和save操作
一.通用的load和save操作 1.概述 对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作. load操作主要用于 ...
- Qt Load and Save Image Dialog 加载图片对话框
在Qt中,我们想要通过对话框来打开某一个图片,可以通过使用QFileDialog来快速实现,参见以下代码: QString fileName = QFileDialog::getOpenFileNam ...
- spark SQL学习(load和save操作)
load操作:主要用于加载数据,创建出DataFrame save操作:主要用于将DataFrame中的数据保存到文件中 代码示例(默认为parquet数据源类型) package wujiadong ...
- netcore XmlDocument 使用Load和Save方法
string path ="C://xxx/file" XmlDocument xmlDoc = new XmlDocument(); #if NET462 xmlDoc.Load ...
- Qt Load and Save PCL/PLY 加载和保存点云
Qt可以跟VTK和PCL等其他库联合使用,十分强大,下面的代码展示了如何使用Qt联合PCL库来加载和保存PCL/PLY格式的点云: 通过按钮加载点云: void QMainWindow::on_pb_ ...
- Docker save & load
docker save Estimated reading time: 1 minute Description Save one or more images to a tar archive (s ...
- docker save docker load
docker save && docker load docker save 镜像1 镜像2 | gzip > images.tar.gz 打包镜像为压缩文件 docker sa ...
随机推荐
- (六)HTML5立方体动画设置
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 解决get方法传递URL参数中文乱码问题
[转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...
- 【java规则引擎】drools6.5.0版本中kmodule.xml解析
kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...
- 学习动态性能表(4)--v$sqltext&v$sqlarea
学习动态性能表 第四篇-(1)-V$SQLTEXT 2007.5.29 本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内. 注:V$SQLARE ...
- List<Map> 排序
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
- jquery中ajax异步调用接口
之前写过一个原始的.无封装的页面,没有引入任何外部js,直接实例化Ajax的XmlRequest对象去异步调用接口,参见Ajax异步调用http接口后刷新页面,可对比一下. 现在我们用jquery包装 ...
- 理解Windows消息循环机制
理解消息循环和整个消息传送机制对Windows编程十分重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message)每个消息是一个整型数值,如果查 ...
- bootstrap 设置表格固定宽度 内容换行
在项目中开发的时候用的bootstrap,但是有些表格的内容 会显示的很长 那么我第一时间想到的就是 修改td或者th的width,但是我设置了 之后不起作用 于是百度找到了解决方法: 学习源头: h ...
- 基于ASIHTTPRequest封装的HttpClient
ASIHTTPRequest作为一个比较知名的http访问库本身功能比较强大,在项目开发过程中,如果每个请求,都要使用ASIHTTPRequest来写,有以下几个弊端: (1)繁琐,无封装性. (2) ...
- jmeter中50%70%80%90%代表的含义
参考 http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html 我的理解是: 在4.08秒响应时间内有50%的用户达到这个4.08的标准 ...