这不是关于Golang或MySQL的问题,这是一个普遍的问题。希望我还在正确的地方,有人可以帮助我缠绕我的头。
我有一个结构角色可以具有多个子角色。
type Role struct{
Name string
Children []Role
}
因此,假设角色A具有儿童角色B,角色B具有儿童角色c。
在我的前端,M2M关系显示为多选择的HTML字段。为了避免无限循环(A-B-C-A ...(,我希望用户无法输入相关角色之一。
例如,角色c不应显示角色A和B,因为如果用户会选择这些,则无限循环会发生。
后端中的数据库看起来像这样:
角色表(主表(id,名称,...
roun_roles (接口表(角色_id,child_id
我创建了此辅助方法来检测不应显示的ID。它正在检查角色c是否在 child_id 的字段中,然后采用此条目的 prole_id ,然后再次执行同样的操作。这起作用了,但看起来真的很不专业,我想知道如何以更优雅的方式解决这一问题,而SQL查询更少...
// whereIDLoop returns the ids which should get excluded
func whereIDLoop(id int) ([]int, error) {
ids := []int{}
b := builder.GlobalBuilder
rows, err := b.Select("role_roles").Columns("role_id").Where("child_id = ?", id).All()
if err != nil {
return nil, err
}
for rows.Next() {
var id int
if err := rows.Scan(&id); err != nil {
return nil,err
}
ids = append(ids, id)
id2,err := whereIDLoop(id)
if err != nil {
return nil, err
}
if id2 != nil{
ids = append(ids, id2...)
}
}
err = rows.Close()
if err != nil {
return nil, err
}
return ids, nil
}
感谢您的任何帮助。干杯pat
不能说最佳实践,我的建议是将验证逻辑放在应用程序层。
- JS中的辅助功能,以过滤像这样的多选中的选项
- API中的验证逻辑
- 存储库层的验证逻辑。
- 在有一个圆圈时,跟踪角色。