Vuex-ORM中如何通过更新模型移除多对多关联关系?
解决Vuex-ORM多对多关联同步移除的问题
你遇到的这个问题其实是Vuex-ORM insertOrUpdate方法的默认行为导致的——它确实只会新增或更新嵌套关联,不会自动移除那些不在传入数据里的已有关联,这是为了符合增量更新的设计逻辑。不过不用手动去删中间表记录,Vuex-ORM提供了专门的方法来处理这种关联同步需求。
解决方案:使用关联的$sync方法
Vuex-ORM的多对多关联实例内置了$sync方法,它可以帮你自动同步关联关系:添加新的关联项,同时移除不在你指定数组里的已有关联项,完全符合你想要的效果。
针对你的场景,你可以这样做:
// 先找到目标Process实例 const targetProcess = Process.find(99); // 同步dependencies关联,传入要保留的依赖ID数组 targetProcess.$sync('dependencies', [1]);
执行这段代码后,mapProcessesDependencies里的[99,2]记录会被自动移除,只保留[99,1],同时Process实例的关联也会同步更新。
同时更新Process本身和关联的封装方案
如果需要在同步关联的同时更新Process的其他字段(比如name),可以把操作封装成一个自定义模型方法,放在Process模型里方便复用:
// 修改Process模型,添加自定义方法 export default class Process extends Model { static entity = 'processes' static fields () { return { id: this.attr(null), name: this.string(''), dependencies: this.belongsToMany( Dependency, MapProcessDependency, 'processId', 'dependencyId' ) } } // 自定义同步方法:更新模型+同步关联 static updateWithSync(id, data) { // 先更新模型本身的字段(排除关联字段) const { dependencies, ...processData } = data; this.update({ where: id, data: processData }); // 再同步关联 const process = this.find(id); process.$sync('dependencies', dependencies || []); } } // 调用自定义方法 Process.updateWithSync(99, { name: "MyProc", dependencies: [1] });
为什么insertOrUpdate无法实现?
再补充下,insertOrUpdate的设计目标是处理模型本身的增量更新,对于嵌套关联,它只会处理存在于传入数据里的关联项:如果关联项已存在就更新,不存在就新增,但不会主动去删除那些不在传入数据里的已有关联——这是为了避免误删用户可能想要保留的关联,所以默认不会做这种“覆盖式”的操作。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

