## 单条记录更新:save( )方法
#### 1. 功能:更新表中满足条件的单条记录。
>[info] save方法每次仅能更新一条记录,所以适用于根据主键更新数据。
* * * * *
#### 2. 参数与返回值
* 参数:
| 序号 | 参数 | 说明 |
| :---: | --- | --- |
| 1 | $array / 一维数组 | 带主键且键名与表中字段名对应的一维数组 |
* 返回值:
| 序号 | 参数 | 说明 |
| :---: | --- | --- |
| 1 | $integer / 整数 | 更新成功,返回受影响记录数量 |
| 2 | false | 更新失败返回布尔值:假 |
* * * * *
#### 3. 实例演示
>[info] 根据主键更新有二种情形:
>1. 主键来自于表中记录;
>2. 主键由用户自己设定;
一、更新tp5_staff表中id等于1011的记录,将姓名name更新为:朱老师,工资salary更新为5000;
>[danger] 第一种情况:主键来自表中记录
* 步骤:
1. 从表中取出id=1011的记录,来初始化模型对象,得到数据对象;
2. 对数据对象中id=1011的数据,更新以name和salary为键名的数组元素;
3. 将更新后的原始数据,写到表中对应记录中,完成更新操作。
* 关于模型Staff.php的创建,与前面是完全一样的,此处就不再赘述啦~~
* 我们先查看一下更新前的数据:
![](https://box.kancloud.cn/86a064b8243f95bc3dbd7c3d7c2fa4b3_590x314.png)
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//导入自定义模型类
use app\index\model\Staff;
class Index {
public function index(){
//1.从表中取出id=1011的数据
$data = Staff::get(1011);
//2.查看从表中取出的数据
echo '1. 查看从表中取出的数据:<br />';
dump($data->getData());
//3.修改数据对象中与表字段对应的原始数据:$data属性
$data -> setAttr('name','朱老师');
$data -> setAttr('salary',5000);
//4.更新表中记录
$affected = $data -> allowField(true) -> save();
//5.查看更新后的数据
echo '2. 查看更新后的数据:<br />';
dump($data -> getData());
//6.判断是否成功,并给出反馈信息
if (!empty($affected)) {
echo '更新成功!';
}else{
echo '更新失败~~';
}
}
}
~~~
>[warning] allowField( ) 限制允许更新定段列表,true:过滤非表字段。也可直接写字段列表,如'name,age,salary'等,即仅接受这3个字段更新,其它字段忽略。
* 查看运行结果:
~~~
1. 查看从表中取出的数据:
array(7) {
["id"] => int(1011)
["name"] => string(9) "张老师"
["sex"] => int(1)
["age"] => int(49)
["salary"] => float(2800)
["dept"] => int(1)
["hiredate"] => string(10) "2005-10-20"
}
2. 查看更新后的数据:
array(7) {
["id"] => int(1011)
["name"] => string(9) "朱老师"
["sex"] => int(1)
["age"] => int(49)
["salary"] => int(5000)
["dept"] => int(1)
["hiredate"] => string(10) "2005-10-20"
}
更新成功!
~~~
>[warning] 为了演示底层实现细节,上面的代码写得比较冗长。现在我们来简化代码:
* 简化后的控制器代码:
~~~
<?php
namespace app\index\controller;
//导入自定义模型类
use app\index\model\Staff;
class Index {
public function index(){
//1.从表中取出id=1011的数据
$data = Staff::get(1011);
//2.更新数据对象:魔术方法实现
$data -> name = '朱老师';
$data -> salary = 5000;
//3.更新表中数据,并反馈执行结果
echo ($data -> allowField(true) -> save()) ? '更新成功!' : '更新失败~~';
}
}
~~~
* 简化后的代码运行结果:
~~~
更新成功!
~~~
* 再看查询表中数据:更新成功!
![](https://box.kancloud.cn/0e0e64eb2b110289eb84e30b5296b560_592x300.png)
* * * * *
>[danger] 第二种情况:更新主键由用户自己定义
**任务:** 更新tp5_staff表中id =1007的记录,将姓名name更新为:'马金莲'。
* 更新前id =1007的数据:
![](https://box.kancloud.cn/a9eda7f788f8bd62c4b9471d72cfe896_591x291.png)
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//导入自定义模型类
use app\index\model\Staff;
class Index {
public function index(){
//设置更新条件
$where = ['id'=> 1007];
//设置更新数据
$data = [];
$data['name'] = '马金莲';
//执行更新操作
$affected = (new Staff) -> allowField(true) -> save($data,$where);
//反馈执行结果
echo $affected ? '更新成功!' : '更新失败~~';
}
}
~~~
>[warning] 注意:save方法并不能自动识别更新数据对象中的更新主键id,必须单独设置更新条件做为第二个参数,这与saveAll方法不同,一定要注意。
* 更新完成后,表中数据如下:
![](https://box.kancloud.cn/8de13bf96518f799f04bc942a233f3fc_589x308.png)
- 前言[随时更新]
- 开发环境
- 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.实例演示