laravel 有没有避免操作数据库时忘记添加where而导致全表修改或删除情况的方法

昨天本人3年职业生涯第一次、重大操作数据库事故,更新数据时忘记了加 where,导致全表更新了,虽然解决了,还是有一种一朝被蛇咬,十年怕井绳的感觉..

人总有状态不好的时候

从代码层面上有没有什么方法避免这种情况?laravel有这方面的解决办法吗?

welcome come back
附言 1  ·  2年前

比较终极的方法还是 sql_safe_updates 但是对已有项目,以及数据库权限因素,实际并不能轻易改动。这也让我反省项目开始时就应考虑到避免这种情况,注意对 sql 的管理。
评论中Model层代码判断 where 条件,大佬的建议也不错,但是查询构造器 DB 仍然不能覆盖,代码层面仍不能完美解决。
对重要的 sql 我建立了一个规范层,强制传入主键更新,如

public static function updateArticleQuery(int $id){
   return DB::table('article')->where('id',$id);
}

但觉的这种无规范可言,所以这个问题无解,小心点就是了。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

可以在mysql开启 sql_safe_updates

2年前 评论
php_yt (楼主) 2年前
讨论数量: 8

可以在mysql开启 sql_safe_updates

2年前 评论
php_yt (楼主) 2年前
playmaker

:cry:

2年前 评论
dyushuo6230 2年前
peter_song

想知道是如何解决的 :see_no_evil:

2年前 评论
php_yt (楼主) 2年前

可以在mysql开启 sql_safe_updates

2年前 评论
php_yt (楼主) 2年前
chowjiawei

在model中添加如下方法

public function newQuery()
    {
        global $_W;
        return parent::newQuery()->where('uniacid', '=', $_W['uniacid']);
    }
2年前 评论
php_yt (楼主) 2年前

我的方案是在 Model 父类做事件监听,风险可控。除了做基本的 where 关键字验证外,还可以根据实际业务做精细化验证,例如管理员权限可以全表更新。

protected static function booted()
{
    static::updating(function ($model) {
        // 在这里判断是否更新操作是否有 where 条件
    });
}
2年前 评论
php_yt (楼主) 2年前

赞同三楼 @忆往昔弹指间 大佬的方案。不仅简单,而且不需要改代码,同时还能防止直接在数据库中执行 SQL 语句时,不加 where 条件导致的恶果。

2年前 评论

三楼大佬的方案确实一劳永逸 再也不用担心手动失误导致全表更新以及全表清除了 :speak_no_evil: 不过同时也记得做好生产环境下数据的定时备份噢

2年前 评论

直接再模型中重写这个方法, 但不确定行得通, 你可以试试

public function newEloquentBuilder($query) 
{
    //        return new Builder($query);
    return new class($query) extends Builder {
        public function update(array $values) {
            if (empty($this->wheres)) {
                throw new Exception('必须有 where 条件');
            }
            return parent::update($values);
        }
    }
}
2年前 评论

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