Laravel中数据更新时如何仅获取指定图片内的目标数据
Laravel 数据更新时仅获取指定变更范围数据的实现方案
Eloquent 原生自带对应的字段变更检测能力,不需要引入第三方包,直接调用内置方法就能实现,适配所有更新触发场景:
核心可用方法
isDirty([$field]):检测模型是否存在字段变更,传入指定字段名时可单独检测对应字段是否被修改getDirty():返回所有待更新的变更字段集合,数组键为字段名,值为修改后的待保存值,没有发生变更的字段不会出现在返回结果里——这就是你需要的、仅本次更新涉及的范围数据getOriginal($field):获取指定字段更新前的原始值getChanges():在save()执行完成后调用,返回本次更新实际写入数据库的字段和对应值
不同场景的代码示例
直接在更新逻辑中取值
// 先查询对应模型实例 $article = Article::query()->find($request->id); // 给模型赋值 $article->title = $request->title; $article->summary = $request->summary; // 保存前即可拿到本次更新涉及的所有字段数据,未修改的字段不会出现在结果中 $updateFieldList = $article->getDirty(); // 单独检测某个字段是否变更 if ($article->isDirty('title')) { $oldTitle = $article->getOriginal('title'); $newTitle = $article->title; // 可针对标题变更做单独逻辑处理 } // 执行保存 $article->save(); // 保存后如果需要拿实际入库的变更数据,调用getChanges $savedChangeData = $article->getChanges();
全局自动触发获取
如果需要在所有该模型的更新操作中自动拿到变更范围数据,直接通过模型事件绑定即可,不需要在每个更新逻辑里重复写:
// 在对应模型的booted方法中注册事件 protected static function booted() { // 更新执行前触发 static::updating(function ($model) { // 这里拿到的就是本次更新涉及的所有范围数据 $changedData = $model->getDirty(); // 可在此处做日志记录、关联数据同步等操作 }); // 更新执行完成后触发 static::updated(function ($model) { $savedChangedData = $model->getChanges(); }); }
注意点:
getDirty()必须在save()方法调用前执行,保存操作完成后脏数据标记会被清空,此时要取变更数据请用getChanges()- 直接调用
Model::where()->update()的批量更新方式不会触发模型事件,也无法检测字段变更,需要先查询出模型实例再逐个赋值保存,才能正常拿到变更范围数据
内容的提问来源于stack exchange,提问作者yo chida
相关产品推荐
相关产品推荐

