gorm icon indicating copy to clipboard operation
gorm copied to clipboard

use TableName() if struct implement `Tabler` interface

Open septemhill opened this issue 2 years ago • 0 comments

What did this pull request do?

For where with struct as first argument, if the structure implement Tabler interface, we could use the table name.

User Case Description


type StorageDepartmentUserRole struct {
	DepartmentId *string `gorm:"column:department_id"`
	UserId       *uint64 `gorm:"column:user_id"`
}

func (w StorageDepartmentUserRole) TableName() string {
	return "department_user_role"
}

type StorageUser struct {
	Id       *uint64 `gorm:"column:id"`
	Username *string `gorm:"column:username"`
}

func (u StorageUser) TableName() string {
	return "user"
}

type GetWorkspaceUserRoleRequest struct {
	WorkspaceUserRoleOption *StorageDepartmentUserRole
	UserOption              *StorageUser
}

func ToPtrString(s string) *string {
	return &s
}

func ToPtrUint64(v uint64) *uint64 {
	return &v
}

func main() {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	var f StorageDepartmentUserRole

	s := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
		return db.
			Model(&StorageWorkspaceUserRole{}).
			Joins("INNER JOIN mpbackend_user ON mpbackend_user.id = mpbackend_workspace_user_role.user_id").
			Where(&StorageDepartmentUserRole{
				DepartmentId: ToPtrString("Septem-Department"),
			}).
			Where(&StorageUser{
				Id: ToPtrUint64(5),
			}).
			Take(&f)
	})

	fmt.Println(s)
}

Output:

SELECT `department_user_role`.`department_id`,`department_user_role`.`user_id` 
FROM `department_user_role` INNER JOIN mpbackend_user ON mpbackend_user.id = mpbackend_workspace_user_role.user_id 
WHERE `department_user_role`.`department_id` = "Septem-Department" AND `user`.`id` = 5 LIMIT 1```

septemhill avatar Jul 31 '22 11:07 septemhill