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 ...
随机推荐
- InpOutx64 替代 winIOx64
/***************************************************************************** * InpOutx64 替代 winIOx ...
- larave 控制器中获取路由参数
Laravel中获取路由参数Route Parameters的五种方法示例 作者:SeekerLiu 这篇文章主要给大家介绍了关于Laravel中获取路由参数Route Parameters的五种方法 ...
- 《DSP using MATLAB》示例Example7.22
代码: h = [1, 2, 3, 4, 3, 2, 1]/15; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1(h); a L amax = ...
- C#中Cache的使用
公共方法Add 将指定项添加到 Cache 对象,该对象具有依赖项.过期和优先级策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程序). Equals(从 Object 继承) 已重载. ...
- 第14篇 PSR-3规范(日志)
1. Specification 1.1 Basics The LoggerInterface exposes eight methods to write logs to the eight RFC ...
- junit基础学习
学习地址一:http://blog.csdn.net/andycpp/article/details/1327147/ 学习地址二:http://blog.csdn.net/zen99t/articl ...
- erlang热部署
以下流程参考rebar的wiki,亲测 rebar的版本一定要注意,高版本对于下面两个指令有bug rebar generate-appups rebar generate-upgrade 经过一个个 ...
- springboot redis简单结合
参考: https://www.cnblogs.com/ityouknow/p/5748830.htmlhttp://blog.csdn.net/i_vic/article/details/53081 ...
- 解决jenkins拉取报告没有样式的问题(还没试过)
来源: https://testerhome.com/topics/9476 对于测试报告来说,除了内容的简洁精炼,样式的美观也很重要.常用的做法是,采用HTML格式的文档,并搭配CSS和JS,实现自 ...
- VC散列表
vc下有2个版本的散列表类,hash_map和unordered_map,hash_map位于stdext命名空间,unordered_map在std命名空间(vs2008及其之后的版本可用),官方推 ...