一、Bind数据
1.1 如果Bind的结构引用了生成的models,请注意struct字段不能设置为指针类型
-
错误示例, 定义指针类型的字段会引起数据无法赋值
type Xxx struct { User *models.User `boil:",bind"` }
-
正确示例
type Xxx struct { User models.User `boil:",bind"` }
1.2 如果Bind的结构需要引用多个生成的models, 定义bind结构的时候需要特别注意以下:
-
如果要引用多个生成的models, 推荐使用匿名方式定义结构体,这个时候bind的tag中不需要声明表名,默认以生成的表名去遍历
type Xxx struct { models.User `boil:",bind"` models.UserProfile `boil:",bind"` }
-
如果一定要以非匿名字段的方式引入多个生成的models, 请注意判断不同表中是否有相同的字段,如果有则需要在bind的tag中指定表名
type Xxx struct { User models.User `boil:"user,bind"` UserProfile models.UserProfile `boil:"userprofile,bind"` }
二、多表JOIN
2.1 如果多表JOIN,在用QueryMod方式构造SQL的时候,需要认真考虑什么时候使用带表名的字段名,什么时候使用单独的字段名,否则不同表同名字段会引起SQL解析错误
2.1.1 建议使用带表名的字段table.field
的场景, 即使用[表名]TableColumns
变量
-
Bind结构体中匿名引入的models,在对应的QueryMod中需要用
[表名]TableColumns
变量, 例如type Xxs struct { modles.Users `boil:",bind"` } models.Users( qm.Select( models.UserTableColumns.ID, ... ) )
-
Bind结构体中非匿名引入的models,如果对应字段的tag中指明了表名,需要在对应的QueryMod中需要用
[表名]TableColumns
变量type Xxs struct { U modles.Users `boil:"user,bind"` } models.Users( qm.Select( models.UserTableColumns.ID, ... ) )
2.1.2 不建议使用带表名的字段
table.field
的场景, 即使用[表名]Columns
变量所有不建议用带表名的字段基本都是需要特殊处理,为了保证后续的可维护性,不建议带表名
-
LeftJoin的表对应的字段有可能为空,需要特殊处理,这里
[表名]Columns
变量方便进行处理type Xxs struct { U modles.Users `boil:"user,bind"` address `boil:"address"` } models.Users( qm.Select( models.UserTableColumns.ID, models.UserProfileColumns.Address, ... ) qm.LeftOuterJoin(....) )
-
某些需要特殊处理的字段,需要特殊处理,这里建议用
[表名]Columns
变量方便进行处理type Xxs struct { U modles.Users `boil:"user,bind"` Favoriates []byte `boil:"addresses"` } models.Users( qm.Select( models.UserTableColumns.ID, models.UserProfileColumns.Favoriates, ) qm.LeftOuterJoin(....) )
2.2 如果使用LeftJoin
,那么对应的数据表的引用值可能为空,请在Bind的结构中定义对应的sql.Null
类型的字段,或者提前在SQL语句中用IFNULL进行处理
假设有以下的SQL, 如果某个用户的profile不存在,那么leftjoin的userprofile则为空
models.Users(
qm.Select(
models.UserTableColumns.ID,
modeles.UserProfileTableColumns.Address,
),
qm.LeftOuterJoin("userrole on userrole.id=user.id")
)
-
解决方案一: 将可能为空的字段单独列出来,并用对应的
sql.Null
类型去定义type Xxx struct { User models.User `boil:"user,bind"` Address sql.NullString `boil:"userprofile,bind"` }
-
解决方案二: 用IFNULL函数确保左连接的数据不为Null
type Xxx struct { User models.User `boil:"user,bind"` UserProfile models.UserProfile `boil:"userprofile,bind"` } models.Users( qm.Select( models.UserTableColumns.ID, `IFNULL(` + modeles.UserProfileTableColumns.Address + `'') AS ` + modeles.UserProfileColumns.Address, ... ), qm.LeftOuterJoin("userrole on userrole.id=user.id") )