## 创建数据对象之:setAttr方法
#### 1. 作用:如果数据对象中已存在指定数据,则更新;如果不存在,则创建。
>[info] setAttr()方法也叫修改器
#### 2. setAttr()源码:
>[info] 本教程如无特别说明:源码均指:Model.php 类文件中的内容。
文件位置:/thinkphp/library/think/Model.php
~~~
/**
* 修改器 设置数据对象值
* @access public
* @param string $name 属性名
* @param mixed $value 属性值
* @param array $data 数据
* @return $this
*/
public function setAttr($name, $value, $data = [])
{
if (is_null($value) && $this->autoWriteTimestamp && in_array($name, [$this->createTime, $this->updateTime])) {
// 自动写入的时间戳字段
$value = $this->autoWriteTimestamp($name);
} else {
// 检测修改器
$method = 'set' . Loader::parseName($name, 1) . 'Attr';
if (method_exists($this, $method)) {
$value = $this->$method($value, array_merge($data, $this->data));
} elseif (isset($this->type[$name])) {
// 类型转换
$value = $this->writeTransform($value, $this->type[$name]);
}
}
// 标记字段更改
if (!isset($this->data[$name]) || ($this->data[$name] != $value && !in_array($name, $this->change))) {
$this->change[] = $name;
}
// 设置数据对象属性
$this->data[$name] = $value;
return $this;
}
~~~
* * * * *
#### 3. 参数与返回值
* 参数:
| 序号 | 参数 | 说明 |
| --- | --- | --- |
| 1 | $name/ 字符串 | 数据对象$data[ ]的数组元素的键名 |
| 2 | $value / 复合类型 | 数据对象$data[ ]的数组元素的值 |
| 3 | $data=[ ] / 数组 | 数据对象$data,通常不需要传入,保持默认即可 |
* 返回值:数据对象
* * * * *
#### 4. 实例演示
1. 任务:给模型对象逐个赋值,创建数据对象
>[info] Staff模型类创建与前面一样的,目前我们使用一个空的模型类就可以完成测试
* 自定义模型类: Staff.php
~~~
<?php
namespace app\index\model;
//导入模型类
use think\model;
class Staff extends model {
//自定义模型类代码
}
~~~
* 控制器Index.php:
~~~
<?php
namespace app\index\controller;
//导入模型类
use app\index\model\Staff;
class Index {
public function index(){
//1.创建模型对象$model
$model = new Staff();
//2.setAttr()方法操作数据对象
//如果该属性不存在,则创建该属性
//如果该属性已存在,则更新该属性
$model -> setAttr('id',10);
$model -> setAttr('name','Jack');
$model -> setAttr('age',20);
//3.查看该数据对象
dump($model);
}
}
~~~
* 浏览器查看结果: tp5.com/index.php/index/index
> tp5.com 是我们之前配置好的一个本地域名
~~~
object(app\index\model\Staff)#5 (28) {
//这里略去与本例无关的属性
······
["data":protected] => array(3) {
["id"] => int(10)
["name"] => string(4) "Jack"
["age"] => int(20)
}
//这里略去与本例无关的属性
······
}
~~~
#### 5. 总结:
>[success] setAttr( )方法,实际开发中并不常用,但我们在Model类源码中,却随处可见他的身影。该方法不仅可以创建数据对象,还可以更新数据对象。但是该方法只能一个个逐个处理数据,多个数据需要同时处理,就必须多次调用才可以实现。
- 前言[随时更新]
- 开发环境
- 1.Mac环境
- 2.windows环境
- 模型对象
- 1.创建模型对象
- 2.模型初始化
- 数据对象
- 1.定义数据对象
- 2.创建数据对象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查询数据对象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP难点总结
- 1.get_class( )实例讲解
- 2.get_called_class( )实例讲解
- 3.__call( )实例讲解
- 3.__callStatic( )实例讲解
- 4.call_user_func_array函数[重点]
- 5.普通方法与静态方法
- 6.在Model源码中的应用
- 7.new static 延迟静态绑定
- PHP标准化规范
- 查询数据
- 1.获取单条:get静态方法
- 2.获取单条:对象查询
- 3.获取多条:all静态方法
- 4.获取多条:对象查询
- 5.获取字段值:value方法
- 6.获取列值:column方法
- 7.动态查询:getBy字段名
- 8.助手函数:model查询
- 9.加载器:Loader类查询
- 10.数据库与模型查询对比
- 新增数据
- 1.sava方法
- 2.savaAll方法
- 3.create静态方法
- 4.insert静态调用
- 更新数据
- 1.单条更新:save方法
- 2.批量更新:saveAll方法
- 3.静态更新:update方法
- 4.查询类Query直接更新
- 5. 闭包更新
- 删除数据
- 1.删除当前记录:delete
- 2.静态条件删除:destory
- 获取器
- 1.模型方法:set属性Attr
- 修改器
- 1.set属性Attr
- 时间戳
- 1.MySQL中日期类型复习
- 2.时间戳功能详解
- 软删除[重点]
- 1.traits详解[选学内容]
- 2.SoftDelet类源码分析
- 3. delete实例删除
- 4.destroy条件删除
- 5.restore恢复数据
- 类型转换
- 1. 规则设置
- 2. 实例演示
- 查询范围
- 1. 基本概念
- 2.实例演示