Eloquent ORM Model 对同一条数据 update 两次导致失败的问题?

class AdDetailModel extends Model
{
    public function updateOperation($field, $id)
    {
        return $this->where($this->primaryKey, $id)->update($field);
    }
}

前端页面点击保存,我会更新数据表。
测试进行测试的时候,在短时间内点击了两次。就出现更新失败了。
最开始我也不知道是什么原因直到
对于同一个id,我连续调用两次该方法,居然会报错。
比如这样,但是没有错误信息

$this->ad_detail_model->updateOperation($update_one, $id);
$this->ad_detail_model->updateOperation($update_one, $id);

phpcoder

梦之马
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
Sparkfly
最佳答案

显示“更新失败”依据的返回是?

 $result = $this->ad_detail_model->updateOperation($update_one, $id);

if( $result === false){
     ...
}
....

=== 而不是 ==

2年前 评论
讨论数量: 6
Sparkfly

显示“更新失败”依据的返回是?

 $result = $this->ad_detail_model->updateOperation($update_one, $id);

if( $result === false){
     ...
}
....

=== 而不是 ==

2年前 评论
梦之马

@Sparkfly 感谢,我从你这里找到了思路。
补充一下我后面的判定代码:

$result = $this->ad_detail_model->updateOperation($update_one, $id);
 if (!$result) {
       return false;
 }
 return true;

Laravel 会对更新的数据做检测,
如果你提交的数据是没有变化的会返回 int(0);如果你提交的数据是有变化的会返回 int(1);
所以我连点两次的第二次提交是没有变化的,返回了0;再!一下 ,就会返回false
那么解决方案就是:
对model中的语句进行异常检测,有异常返回 -1;
外面的$result 变为 if($result<0){ return false;}

2年前 评论

可以用try {} catch {},

2年前 评论
梦之马

@xuanjiang1985 不能,因为这不能算是异常情况,laravel内部有脏检查的机制。在调用update 的时候会进行exist检查再进行isdirty检查。在laravel中它会认为第二次更新是干净的,so会返回0

2年前 评论
xin6841414

@梦之马 请问 怎么做的异常检测, 同样遇到你这个问题了,

1年前 评论
梦之马

@xin6841414

/**
     * Update the model in the database.
     *
     * @param  array  $attributes
     * @param  array  $options
     * @return bool|int
     */
    public function update(array $attributes = [], array $options = [])
    {
        if (! $this->exists) {
            return false;
        }

        return $this->fill($attributes)->save($options);
    }

其实你从这段源代码来看就知道一些东西了,快速更新是会出现返回值为0的情况,所以只要返回值为int 那么就视为成功,你也可以添加一个updated_at时间戳

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!