From 56b7a832510ccc3048dfa8abde35fdd4a67a2256 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 24 Dec 2023 23:18:35 +0800 Subject: [PATCH] :art: Add Relation column to database table view https://github.com/siyuan-note/siyuan/issues/9888 --- kernel/model/attribute_view.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 1b20989a0..19a3ce7fa 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -2171,6 +2171,10 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string, isUpdatingBlockKey := av.KeyTypeBlock == val.Type oldBoundBlockID := val.BlockID + var oldRelation *av.ValueRelation + if av.KeyTypeRelation == val.Type { + oldRelation = val.Relation + } data, err := gulu.JSON.MarshalJSON(valueData) if nil != err { return @@ -2178,6 +2182,10 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string, if err = gulu.JSON.UnmarshalJSON(data, &val); nil != err { return } + if av.KeyTypeRelation == val.Type { + // 关联列得 content 是自动渲染的,所以不需要保存 + val.Relation.Contents = nil + } // val.IsDetached 只有更新主键的时候才会传入,所以下面需要结合 isUpdatingBlockKey 来判断 @@ -2214,9 +2222,27 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string, key, _ := attrView.GetKey(val.KeyID) if nil != key && av.KeyTypeRelation == key.Type && nil != key.Relation && key.Relation.IsTwoWay { - // 更新双向关联的目标值 destAv, _ := av.ParseAttributeView(key.Relation.AvID) if nil != destAv { + if nil != oldRelation { + // 清空旧的双向关联的目标值 + for _, blockID := range oldRelation.BlockIDs { + for _, keyValues := range destAv.KeyValues { + if keyValues.Key.ID != key.Relation.BackKeyID { + continue + } + + for _, value := range keyValues.Values { + if value.BlockID == blockID { + value.Relation.BlockIDs = gulu.Str.RemoveElem(value.Relation.BlockIDs, rowID) + break + } + } + } + } + } + + // 更新新的双向关联的目标值 for _, blockID := range val.Relation.BlockIDs { for _, keyValues := range destAv.KeyValues { if keyValues.Key.ID != key.Relation.BackKeyID {