## 单条记录更新: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)