Laravel中如何将模型对象数组存入session且保持关联与数据库同步
问题根因
你存储到session中的是模型对象序列化后的静态快照,保存的是写入session那一瞬间的所有属性、预加载关联数据的副本,本身和数据库没有动态绑定关系。后续数据库的关联数据发生更新时,session里的静态副本不会自动同步,所以你读取到的永远是写入时的旧数据。
推荐解决方案
- 优先选择仅存储购物车记录的主键ID数组到session,读取数据时通过ID实时查询数据库,同时加载所需关联数据,可保证拿到的永远是最新数据。
示例(Laravel框架场景):// 写入session时仅存储ID数组 session()->put('cart_ids', $carts->pluck('id')->toArray()); // 读取购物车时实时查询并加载关联 $carts = Cart::with('你需要的关联关系名')->whereIn('id', session()->get('cart_ids', []))->get(); - 若有临时缓存模型减少查询的需求,可给session存储的模型数据设置合理的过期时间,同时在关联数据更新的业务节点(例如商品价格/库存修改、购物车商品规格调整等),主动清除session中存储的旧购物车模型数据,强制下次读取重新拉取最新数据。
- 如确实需要直接存储模型对象,从session取出数据后可调用对应ORM提供的
refresh()方法主动刷新模型属性与关联数据,该方案仅适合购物车数据量极小的场景,数据量大时会产生大量单次查询请求,性能远低于批量ID查询方案,不推荐使用。
注意事项
除非是完全不会变更的静态数据,否则不要将包含关联关系的ORM模型这类复杂结构直接序列化存储到session、缓存等存储介质中,除了数据不同步的问题外,还会额外占用更多存储资源,模型结构迭代时也容易出现序列化/反序列化异常。
内容的提问来源于stack exchange,提问作者ahmmaad gamal
相关产品推荐
相关产品推荐

