Laravel 5.8中sync执行后关联集合未更新的问题求助
解决Laravel sync()后关联集合未更新的问题
你遇到的这个问题是Laravel Eloquent关联缓存机制导致的——当你首次访问$paper->authorCollection时,Eloquent会把关联数据缓存到模型实例的relations属性中,执行sync()修改中间表数据后,缓存的旧数据并不会自动更新,所以才需要重新查询模型。
不需要重新查询整个Paper模型,有几个更高效的方案可以直接更新关联集合:
方案1:重新加载指定关联(推荐)
使用load()方法手动重新加载authorCollection关联,这只会刷新该关联的数据,不会重新查询整个Paper模型,性能更优:
$sync = array(); foreach($authors as $auth) { $sync[$auth->id] = ['authorNum'=>intval($auth->authorNum)]; } $paper->authorCollection()->sync($sync); // 重新加载authorCollection关联,覆盖缓存的旧数据 $paper->load('authorCollection'); // 现在$paper->authorCollection就是更新后的最新数据了
方案2:刷新整个模型及其关联
如果你需要刷新模型本身和所有已加载的关联,可以使用refresh()方法:
$paper->authorCollection()->sync($sync); // 从数据库重新加载模型及所有关联 $paper->refresh();
这个方法会重新查询Paper模型并加载所有之前已加载的关联,适合需要同时更新模型本身属性和关联的场景。
为什么sync()不会自动更新关联?
Laravel的Eloquent为了避免重复查询数据库,会对已加载的关联进行缓存。sync()方法仅负责修改中间表的数据,但不会主动触发模型关联缓存的更新,所以需要我们手动调用加载方法来刷新缓存。
内容的提问来源于stack exchange,提问作者BobofMellor
相关产品推荐
相关产品推荐

