关联

  • 更新是Upsert操作,即INSERT && ON DUPLICATE KEY UPDATE关联

    • 这个是Gorm为确保关联性正确的机制(如果自己确定这个数据肯定存在且不需要更新,那么这条SQL非常烦人,关联基本都这样做的)
    • 默认只是更新关联字段,FullSaveAssociations=true才会全更新
      • 因此基本上可以忽视这条SQL
  • Create、Updates都会自动处理传入函数的对象的关联字段,创建/更新关联数据,除非是空值

    • 指定处理关联:Select(*) || clause.Associations || Omit
    • 对于Delete,Gorm则谨慎操作,也就是需要手动Select
      • Select(*).Delete不是删除全部,Select(clause.Associations).Delete才是
      • 但是操作仍然就是删除,像一对一、一对多,是直接进行数据删除的,多对多则是删除关联中间表的数据
    • 禁止关联操作:Omit(clause.Associations)
  • 关联操作包装器Association

    • 查找
      • Model.Association.Find:可以使用Select、Where等
        • 如果是多对多,会进行连表(无法只查询中间表)
      • Preload:在查询实体时同时加载关联
    • Append:新增关联
      • Append的数据不仅仅是方法参数,还包括了Model传入对象的关联字段,因此推荐使用Model(M{ID: id})的方式调用,且同时会给这个对象设置这个关联字段
    • Delete:删除关联,与直接Delete不同,一对一、一对多数据会设置关联字段为null而不是直接把这条数据删除(但是如果是Association().Unscoped() 就会直接删除,多对多仍然只能删除中间表)
      • 即相当于Select(clause.Associations).Delete
      • 同时会给这个对象删除这个关联字段
    • Replace:将关联替换为传入的,即会删除非传入的(删除效果和上面的Association.Delete一样)
      • 同时会给这个对象替换这个关联字段
    • Clear:就是Association.Delete所有

    • Replace:顾名思义,将关联完完全全替换为当前传递的,但对于旧数据不会进行删除而是只是取消旧关联

      • OneToMany
        • 设置关联表的关联字段为null
          • 替换不会删除不在当前关联值中的
      • ManyToMany
        • INSERT && ON DUPLICATE KEY UPDATE 关联
        • INSERT && ON DUPLICATE KEY UPDATE 中间表
        • DELETE中间表中不在当前关联值中的