为了账号安全,请及时绑定邮箱和手机立即绑定

使用 gorm golang 在多个表中进行动态列搜索

使用 gorm golang 在多个表中进行动态列搜索

Go
慕雪6442864 2023-06-12 15:20:35
我的场景是我有一个带有搜索选项的网格,用户可以在其中选择列并进行搜索,网格数据来自各种表。我附上了网格示例屏幕。所以我正在尝试为搜索创建一个动态查询,但问题是我只能在主表 (schema.Robot) 中搜索,而不能在 Preload 表中搜索。每当我尝试从 Preload 表中搜索数据时,让我们从 RobotModel 表中说那个时间低于错误pq:缺少表“robot_models”的 FROM 子句条目这是我的代码func (r *RobotsRepository) GetRobotsSummary(listParams viewmodel.ListParams, companyID uint) ([]*schema.Robot, int, error) {mrobots := []*schema.Robot{}var count intvar order stringif listParams.SortColumn == "" {    listParams.SortColumn = "id"    listParams.SortOrder = 1} else {    listParams.SortColumn = util.Underscore(listParams.SortColumn)}if listParams.SortOrder == 0 {    order = "ASC"} else {    order = "DESC"}var searchQuery stringif listParams.SearchText != "" {    switch listParams.SearchColumn {    case "Robot":        listParams.SearchColumn = "name"    case "Model":        listParams.SearchColumn = "robot_models.name"    }    searchQuery = listParams.SearchColumn +" LIKE '%"+ listParams.SearchText +"%' and Company_ID = " + fmt.Sprint(companyID)}else{    searchQuery = "Company_ID = " + fmt.Sprint(companyID)}   orderBy := fmt.Sprintf("%s %s", listParams.SortColumn, order)err := r.Conn.    Preload("RobotModel", func(db *gorm.DB) *gorm.DB {        return db.Select("ID,Name")    }).    Preload("Task", func(db *gorm.DB) *gorm.DB {        return db.Where("Task_Status in ('In-Progress','Pending')").Select("ID, Task_Status")    }).    Preload("CreatedUser", func(db *gorm.DB) *gorm.DB {        return db.Select("ID,Display_Name")    }).    Preload("UpdatedUser", func(db *gorm.DB) *gorm.DB {        return db.Select("ID,Display_Name")    }).    Where(searchQuery).    Order(orderBy).    Offset(listParams.PageSize * (listParams.PageNo - 1)).    Limit(listParams.PageSize).    Find(&mrobots).Errorr.Conn.Model(&schema.Robot{}).Where(searchQuery).Count(&count)return mrobots, count, err }在 searchQuery 变量中,我存储了我的动态查询。我的问题是如何搜索预加载表列的数据
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

即使您正在预加载,您仍然需要在对其他表的列进行过滤和排序时显式使用连接。预加载用于预先加载数据以映射到您的模型中,而不是连接表。

链接这样的东西:

.Joins("LEFT JOIN rfm.robot_models AS robot_models ON robot_models.id = robots.robot_model_id")

我不确定您是否可以使用AS此技术使用关键字,但如果不能,相应地调整您的查询应该很容易。


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信