Forráskód Böngészése

完成一对一关联更新逻辑

yjp 1 éve
szülő
commit
dc54fa33ee

+ 1 - 1
convenient/binding/request/dto.go

@@ -60,7 +60,7 @@ func getRequestParamsValue(params Params, fieldName string) (*reflect.Value, err
 
 	paramsValue := reflect.ValueOf(params)
 
-	if reflectutils.IsValueStructOrStructPointer(paramsValue) {
+	if !reflectutils.IsValueStructOrStructPointer(paramsValue) {
 		return nil, fserr.New("请求参数必须是结构或结构指针")
 	}
 

+ 25 - 5
convenient/relation/one2one/service.go

@@ -13,7 +13,7 @@ import (
 	"git.sxidc.com/service-supports/fserr"
 )
 
-func Update(fromTableName string, fromRelationFieldName string, fromRelationColumnName string, toTableName string, toDomainCNName string) binding.ServiceFunc[any] {
+func Update(fromTableName string, fromRelationFieldName string, fromRelationColumnName string, toTableName string, toDomainCNName string, toRelationColumnName string) binding.ServiceFunc[any] {
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
 		object := objects[0]
 		if object == nil {
@@ -68,10 +68,30 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 			}
 		}
 
-		err = database.Update(i.DBExecutor(), &sql.UpdateExecuteParams{
-			TableName:  toTableName,
-			TableRow:   sql.NewTableRow().Add(fromRelationColumnName, toID),
-			Conditions: sql.NewConditions().Equal(domain.ColumnID, fromEntity.GetID()),
+		err = database.Transaction(i.DBExecutor(), func(tx database.Executor) error {
+			if strutils.IsStringNotEmpty(fromTableName) {
+				err := database.Update(tx, &sql.UpdateExecuteParams{
+					TableName:  fromTableName,
+					TableRow:   sql.NewTableRow().Add(fromRelationColumnName, toID),
+					Conditions: sql.NewConditions().Equal(domain.ColumnID, fromEntity.GetID()),
+				})
+				if err != nil {
+					return err
+				}
+			}
+
+			if strutils.IsStringNotEmpty(toTableName) {
+				err := database.Update(tx, &sql.UpdateExecuteParams{
+					TableName:  toTableName,
+					TableRow:   sql.NewTableRow().Add(toRelationColumnName, fromEntity.GetID()),
+					Conditions: sql.NewConditions().Equal(domain.ColumnID, toID),
+				})
+				if err != nil {
+					return err
+				}
+			}
+
+			return nil
 		})
 		if err != nil {
 			return nil, err

+ 8 - 12
convenient/relation/one2one/simple.go

@@ -7,7 +7,6 @@ import (
 	"git.sxidc.com/go-framework/baize/convenient/binding/response"
 	"git.sxidc.com/go-framework/baize/framwork/domain"
 	"github.com/iancoleman/strcase"
-	"reflect"
 )
 
 // Simple 关联的Bind参数
@@ -20,10 +19,10 @@ type Simple[LI any, RI any] struct {
 	// 右领域实体,注意是Entity类型
 	Right domain.Entity
 
-	// 左表名
+	// 左表名,只存在单侧表,赋值空即可
 	LeftTableName string
 
-	// 右表名
+	// 右表名,只存在单侧表,赋值空即可
 	RightTableName string
 
 	// URL领域相对路径,如/user/userInfo,后面会自动补充,如/user/userInfo/update
@@ -57,13 +56,10 @@ type Simple[LI any, RI any] struct {
 func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 	options := simple.options
 
-	leftEntityType := reflect.TypeOf(simple.Left)
-	rightEntityType := reflect.TypeOf(simple.Right)
-
-	leftRelationFieldName := fmt.Sprintf("%sID", strcase.ToCamel(rightEntityType.Name()))
-	rightRelationFieldName := fmt.Sprintf("%sID", strcase.ToCamel(leftEntityType.Name()))
-	leftRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(rightEntityType.Name()))
-	rightRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(leftEntityType.Name()))
+	leftRelationFieldName := fmt.Sprintf("%sID", simple.Right.DomainCamelName())
+	rightRelationFieldName := fmt.Sprintf("%sID", simple.Left.DomainCamelName())
+	leftRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(simple.Right.DomainCamelName()))
+	rightRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(simple.Left.DomainCamelName()))
 
 	if !options.disableLeft {
 		if !options.disableLeftUpdate {
@@ -74,7 +70,7 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 				RequestParams: simple.LeftUpdateJsonBody,
 				Objects:       []domain.Object{simple.Left},
 				ServiceFunc: Update(simple.LeftTableName, leftRelationFieldName, leftRelationColumnName,
-					simple.RightTableName, simple.Right.DomainCNName()),
+					simple.RightTableName, simple.Right.DomainCNName(), rightRelationColumnName),
 			})
 		}
 	}
@@ -88,7 +84,7 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 				RequestParams: simple.RightUpdateJsonBody,
 				Objects:       []domain.Object{simple.Right},
 				ServiceFunc: Update(simple.RightTableName, rightRelationFieldName, rightRelationColumnName,
-					simple.LeftTableName, simple.Left.DomainCNName()),
+					simple.LeftTableName, simple.Left.DomainCNName(), leftRelationColumnName),
 			})
 		}
 	}

+ 4 - 0
examples/examples/project/application/domain/class/entity.go

@@ -34,6 +34,10 @@ func (e *Entity) DomainCNName() string {
 	return "班级"
 }
 
+func (e *Entity) DomainCamelName() string {
+	return "Class"
+}
+
 func (e *Entity) ForCreate() error {
 	err := e.CheckFieldID(e.DomainCNName())
 	if err != nil {

+ 4 - 0
examples/examples/project/application/domain/family/entity.go

@@ -36,6 +36,10 @@ func (e *Entity) DomainCNName() string {
 	return "家庭"
 }
 
+func (e *Entity) DomainCamelName() string {
+	return "Family"
+}
+
 func (e *Entity) ForCreate() error {
 	err := e.CheckFieldID(e.DomainCNName())
 	if err != nil {

+ 1 - 1
examples/examples/project/application/domain/family/request_params.go

@@ -32,7 +32,7 @@ type (
 
 	UpdateStudentOfFamilyJsonBody struct {
 		request.IDJsonBody
-		StudentID string `json:"studentId" binding:"required" assign:"toField:StudentID"`
+		StudentID string `json:"studentId" assign:"toField:StudentID"`
 	}
 
 	QueryStudentOfFamilyQueryParams struct {

+ 4 - 0
examples/examples/project/application/domain/student/entity.go

@@ -33,6 +33,10 @@ func (e *Entity) DomainCNName() string {
 	return "学生"
 }
 
+func (e *Entity) DomainCamelName() string {
+	return "Student"
+}
+
 func (e *Entity) ForCreate() error {
 	err := e.CheckFieldID(e.DomainCNName())
 	if err != nil {

+ 1 - 1
examples/examples/project/application/domain/student/request_params.go

@@ -29,7 +29,7 @@ type (
 
 	UpdateFamilyOfStudentJsonBody struct {
 		request.IDJsonBody
-		FamilyID string `json:"familyId" binding:"required" assign:"toField:FamilyID"`
+		FamilyID string `json:"familyId" assign:"toField:FamilyID"`
 	}
 
 	QueryFamilyOfStudentQueryParams struct {

+ 5 - 0
framwork/domain/entity.go

@@ -7,6 +7,7 @@ import (
 type Entity interface {
 	Object
 	DomainCNName() string
+	DomainCamelName() string
 	GenerateID() error
 	GetID() string
 	CheckFieldID(domainCNName string) error
@@ -22,6 +23,10 @@ func (e *BaseEntity) DomainCNName() string {
 	panic("领域实体没有实现DomainCNName接口")
 }
 
+func (e *BaseEntity) DomainCamelName() string {
+	panic("领域实体没有实现DomainCamelName接口")
+}
+
 func (e *BaseEntity) GenerateID() error {
 	e.ID = strutils.SimpleUUID()
 	return nil

+ 2 - 2
framwork/domain/object.go

@@ -76,7 +76,7 @@ func hasField(object Object, fieldName string) bool {
 	}
 
 	objectValue := reflect.ValueOf(object)
-	if reflectutils.IsValueStructOrStructPointer(objectValue) {
+	if !reflectutils.IsValueStructOrStructPointer(objectValue) {
 		return false
 	}
 
@@ -95,7 +95,7 @@ func getFieldValue(object Object, fieldName string) (*reflect.Value, error) {
 
 	objectValue := reflect.ValueOf(object)
 
-	if reflectutils.IsValueStructOrStructPointer(objectValue) {
+	if !reflectutils.IsValueStructOrStructPointer(objectValue) {
 		return nil, fserr.New("领域对象必须是结构或结构指针")
 	}