概述
问题简述:
批量更新同一张表数据的状态,只有一条更新成功
使用的model更新语句是:
$pk = $this->pk;
$this->isUpdate(true)->save(array_merge($data, [$pk => $id]))
控制器:
$teacherAuditL = new TeacherAuditLogic();
$teacherAuditL->infoAudit($sId, $data['audit'], $data['reason']);
中间件:
public function infoAudit($id, $accept, $reason = '') {
$teacherInfoAuditFlowM = new TeacherInfoAuditFlow();
Db::startTrans();
try {
$aId = explode(',',$id);
foreach($aId as $v){
$teacherInfoAuditFlowM->improve($v, ['status' => 'yes' == $accept ? TeacherInfoAuditFlowEnum::STATUS_SUCCESS : TeacherInfoAuditFlowEnum::STATUS_FAIL, 'reason' => $reason]);
}
} catch (Throwable $e) {
Db::rollback();
throw new ApplicationException(['msg' => $e->getMessage()]);
}
}
结果只有第一条传入的数据变更了,后续的id并没有更新
经过排查,发现Model.php文件中的方法save中 $this->origin = $this->data;
public function save($data = [], $where = [], $sequence = null) {
if (is_string($data)) {
$sequence = $data;
$data = [];
}
if (!$this->checkBeforeSave($data, $where)) {
return false;
}
$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);
if (false === $result) {
return false;
}
// 写入回调
$this->trigger('after_write');
// 重新记录原始数据
$this->origin = $this->data;
$this->set = [];
return true;
}
导致第一个id的更新数据被记录,后续的id要更新的内容经过比对后又一致,结果就只有id要被更新
Attribute.php,经过这个方法处理后,就没有数据要更新了
/**
* 获取变化的数据 并排除只读数据
* @access public
* @return array
*/
public function getChangedData() {
if ($this->force) {
$data = $this->data;
} else {
$data = array_udiff_assoc($this->data, $this->origin, function ($a, $b) {
dump(['a'=>$a,'b'=>$b]);
if ((empty($a) || empty($b)) && $a !== $b) {
return 1;
}
return is_object($a) || $a != $b ? 1 : 0;
});
}
if (!empty($this->readonly)) {
// 只读字段不允许更新
foreach ($this->readonly as $key => $field) {
if (isset($data[$field])) {
unset($data[$field]);
}
}
}
return $data;
}
解决办法:
1.注释掉Model.php 的 $this->origin = $this->data; 这行代码
2.把循环在controller层实现,目的是把初始化model包在循环里
最后
以上就是沉默猫咪为你收集整理的Thinkphp5.1 save循环更新同一张表的bug($this->origin)的全部内容,希望文章能够帮你解决Thinkphp5.1 save循环更新同一张表的bug($this->origin)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复