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);
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
Sparkfly
最佳答案

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

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

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

=== 而不是 ==

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

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

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

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

=== 而不是 ==

6年前 评论
梦之马

@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;}

6年前 评论

可以用try {} catch {},

6年前 评论
梦之马

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

6年前 评论
xin6841414

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

5年前 评论
梦之马

@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时间戳

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!