You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    });
}

注意点:

  1. getDirty()必须在save()方法调用前执行,保存操作完成后脏数据标记会被清空,此时要取变更数据请用getChanges()
  2. 直接调用Model::where()->update()的批量更新方式不会触发模型事件,也无法检测字段变更,需要先查询出模型实例再逐个赋值保存,才能正常拿到变更范围数据

内容的提问来源于stack exchange,提问作者yo chida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:12:31