Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用可选参数创建GORM动态查询_Mysql_Go_Go Gorm - Fatal编程技术网

Mysql 使用可选参数创建GORM动态查询

Mysql 使用可选参数创建GORM动态查询,mysql,go,go-gorm,Mysql,Go,Go Gorm,我被GORM问题困扰了一整天。我需要能够过滤邮件表上的任何4件事:发件人,收件人,关键字和日期范围。它还必须分页。按发件人和收件人进行筛选,分页也可以。到目前为止,这是我提出的查询,但它似乎不适用于日期范围或关键字 下面是我如何从MySQL中进行选择 db.Preload("Thread").Where(query).Scopes(Paginate(r)).Find(&threadMessages) 我创建的查询如下所示: var query map[string]

我被GORM问题困扰了一整天。我需要能够过滤邮件表上的任何4件事:发件人,收件人,关键字和日期范围。它还必须分页。按发件人和收件人进行筛选,分页也可以。到目前为止,这是我提出的查询,但它似乎不适用于日期范围或关键字

下面是我如何从MySQL中进行选择

db.Preload("Thread").Where(query).Scopes(Paginate(r)).Find(&threadMessages)
我创建的查询如下所示:

var query map[string]interface{}
query = map[string]interface{}{"created_at > ?": fromDate}
    fields := []string{""}
    values := []interface{}{}
然后根据传递的参数,通过向映射添加新的键值来更新查询,如下所示:

query = map[string]interface{}{"user_id": sender, "recipient_id": recipient}
对于日期,如果我尝试这样的方法,它似乎不起作用:

var query map[string]interface{}
query = map[string]interface{}{"created_at > ?": fromDate}
    fields := []string{""}
    values := []interface{}{}
对于类似的情况,is似乎也不起作用:

query = map[string]interface{}{"contents LIKE ?": keyword}

我选择这种方法的原因是,我似乎无法获得可选的输入,因为它接受一个带有位置参数和空位置参数的字符串,所以似乎会导致MySQL返回一个空数组。还有其他人处理过这样复杂的GORM问题吗?此时非常感谢您的帮助。

map[string]接口{}
传递到
Where()
仅适用于等于操作,或操作中的(如果提供了一个切片作为值)

实现所需的一种方法是构造
子句.Expression
的切片,并在需要时将子句附加到切片中。然后,您可以简单地将所有子句(使用
操作符传递整个片段)传递到
db.clauses()

子句:=make([]子句.Expression,0)
如果mustFilterCreatedAt{
子句=追加(子句,子句.Gt{Column:“created_at”,fromDate})
}
如果有过滤内容{
子句=追加(子句,子句,如{Column:“contents”,Value:keyword})
}
db.Preload(“Thread”).子句(子句…).Scopes(Paginate(r)).Find(&threadMessages)
注意:如果您试图搜索包含
关键字
的内容,则应将通配符
%
连接到
关键字
的末尾,否则
LIKE
的行为基本上与
=
相同:

子句。类似于{Column:“contents”,值:“%”+关键字+“%”

我的最终解决方案是创建动态Where子句,根据这些子句从客户端发送查询参数,如下所示:

var query map[string]interface{}
query = map[string]interface{}{"created_at > ?": fromDate}
    fields := []string{""}
    values := []interface{}{}
例如,如果存在关键字param:

    fields = []string{"thread_messages.contents LIKE ?"}
    values = []interface{}{"%" + keyword + "%"}
并在以下查询中使用动态子句:

db.Preload("Thread", "agency_id = ?", agencyID).Preload("Thread.ThreadUsers", "agency_id = ?", agencyID).Joins("JOIN threads on thread_messages.thread_id = threads.id").Where("threads.agency_id = ?", agencyID).Where(strings.Join(fields, " AND "), values...).Scopes(PaginateMessages(r)).Find(&threadMessages)

谢谢这似乎完成了我想做的事情。