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

我的场景是我有一个带有搜索选项的网格,用户可以在其中选择列并进行搜索,网格数据来自各种表。我附上了网格示例屏幕。

所以我正在尝试为搜索创建一个动态查询,但问题是我只能在主表 (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 int

var order string

if 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 string

if 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).Error


r.Conn.Model(&schema.Robot{}).Where(searchQuery).Count(&count)


return mrobots, count, err 

}

在 searchQuery 变量中,我存储了我的动态查询。我的问题是如何搜索预加载表列的数据


慕雪6442864
浏览 171回答 1
1回答

德玛西亚99

即使您正在预加载,您仍然需要在对其他表的列进行过滤和排序时显式使用连接。预加载用于预先加载数据以映射到您的模型中,而不是连接表。链接这样的东西:.Joins("LEFT JOIN rfm.robot_models AS robot_models ON robot_models.id = robots.robot_model_id")我不确定您是否可以使用AS此技术使用关键字,但如果不能,相应地调整您的查询应该很容易。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go