gorm
gorm copied to clipboard
use TableName() if struct implement `Tabler` interface
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```