关联
-
更新是Upsert操作,即
INSERT && ON DUPLICATE KEY UPDATE关联- 这个是Gorm为确保关联性正确的机制(如果自己确定这个数据肯定存在且不需要更新,那么这条SQL非常烦人,关联基本都这样做的)
- 默认只是更新关联字段,FullSaveAssociations=true才会全更新
- 因此基本上可以忽视这条SQL
-
Create、Updates都会自动处理传入函数的对象的关联字段,创建/更新关联数据,除非是空值
- 指定处理关联:
Select(*) || clause.Associations || Omit - 对于Delete,Gorm则谨慎操作,也就是需要手动
SelectSelect(*).Delete不是删除全部,Select(clause.Associations).Delete才是- 但是操作仍然就是删除,像一对一、一对多,是直接进行数据删除的,多对多则是删除关联中间表的数据
- 禁止关联操作:
Omit(clause.Associations)
- 指定处理关联:
-
关联操作包装器Association
- 查找
Model.Association.Find:可以使用Select、Where等- 如果是多对多,会进行连表(无法只查询中间表)
Preload:在查询实体时同时加载关联
- Append:新增关联
- Append的数据不仅仅是方法参数,还包括了Model传入对象的关联字段,因此推荐使用
Model(M{ID: id})的方式调用,且同时会给这个对象设置这个关联字段
- Append的数据不仅仅是方法参数,还包括了Model传入对象的关联字段,因此推荐使用
- Delete:删除关联,与直接Delete不同,一对一、一对多数据会设置关联字段为null而不是直接把这条数据删除(但是如果是
Association().Unscoped()就会直接删除,多对多仍然只能删除中间表)- 即相当于
Select(clause.Associations).Delete - 同时会给这个对象删除这个关联字段
- 即相当于
- Replace:将关联替换为传入的,即会删除非传入的(删除效果和上面的
Association.Delete一样)- 同时会给这个对象替换这个关联字段
-
Clear:就是
Association.Delete所有 -
Replace:顾名思义,将关联完完全全替换为当前传递的,但对于旧数据不会进行删除而是只是取消旧关联
- OneToMany
- 设置关联表的关联字段为null
- 替换不会删除不在当前关联值中的
- 设置关联表的关联字段为null
- ManyToMany
INSERT && ON DUPLICATE KEY UPDATE关联INSERT && ON DUPLICATE KEY UPDATE中间表- DELETE中间表中不在当前关联值中的
- OneToMany
- 查找