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

使用Eloquent更新外键值后,relations属性仍显示旧值的问题

问题解决:Eloquent更新外键后关联缓存未刷新

这是因为Eloquent模型的关联缓存机制在起作用:你通过get()加载模型时,旧的basket关联数据已经被缓存到了模型的relations属性里,更新外键字段后,这个缓存不会自动同步更新。

给你几个可行的解决办法:

  • 方法一:更新后刷新模型
    在循环里更新完字段后,调用refresh()方法刷新整个模型(包括关联数据),或者用load()只重新加载指定关联:

    $fruits = Fruit::whereIn('basket', [200, 300])->get();
    
    foreach ($fruits as $fruit) {
      $fruit->update(["basket_id" => 100]);
      // 刷新模型及所有关联
      $fruit->refresh();
      // 或者仅重新加载basket关联,性能更优
      // $fruit->load('basket');
    }
    
  • 方法二:用批量更新替代循环(更高效)
    不需要加载所有模型实例到内存,直接执行数据库层面的批量更新,从根源上避免缓存问题:

    Fruit::whereIn('basket', [200, 300])->update(["basket_id" => 100]);
    

    这种方式性能更好,尤其当数据量较大时,推荐优先使用。

  • 方法三:手动清除关联缓存
    如果不想刷新整个模型,也可以手动删除缓存的关联数据,之后再访问关联时会自动从数据库重新加载:

    $fruits = Fruit::whereIn('basket', [200, 300])->get();
    
    foreach ($fruits as $fruit) {
      $fruit->update(["basket_id" => 100]);
      // 清除已缓存的basket关联
      unset($fruit->relations['basket']);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:07:12