我很难理解为什么我一直从尝试执行的查询中获得0个结果。基本上,我试图仅返回日期范围内的结果。在给定的表上,我有一个createdAt
,它是DateTime标量。基本上,这是从Arizona(或graphql,不确定是哪个设置)自动填充的。因此,在任何表上我都有createdAt,它是一个DateTime字符串,代表创建时的DateTime。
这是给定表的模式:
type Audit {
id: ID! @unique
user: User!
code: AuditCode!
createdAt: DateTime!
updatedAt: DateTime!
message: String
}
我查询了此表并返回了一些结果,我将在此处共享它们:
"getAuditLogsForUser": [
{
"id": "cjrgleyvtorqi0b67jnhod8ee",
"code": {
"action": "login"
},
"createdAt": "2019-01-28T17:14:30.047Z"
},
{
"id": "cjrgn99m9osjz0b67568u9415",
"code": {
"action": "adminLogin"
},
"createdAt": "2019-01-28T18:06:03.254Z"
},
{
"id": "cjrgnhoddosnv0b67kqefm0sb",
"code": {
"action": "adminLogin"
},
"createdAt": "2019-01-28T18:12:35.631Z"
},
{
"id": "cjrgnn6ufosqo0b67r2tlo1e2",
"code": {
"action": "login"
},
"createdAt": "2019-01-28T18:16:52.850Z"
},
{
"id": "cjrgq8wwdotwy0b67ydi6bg01",
"code": {
"action": "adminLogin"
},
"createdAt": "2019-01-28T19:29:45.616Z"
},
{
"id": "cjrgqaoreoty50b67ksd04s2h",
"code": {
"action": "adminLogin"
},
"createdAt": "2019-01-28T19:31:08.382Z"
}]
这是我的getAuditLogsForUser
模式定义
getAuditLogsForUser(userId: String!, before: DateTime, after: DateTime): [Audit!]!
因此,要进行测试,我希望将所有结果都放在最后一个和第一个之间。
2019-01-28T19:31:08.382Z
是最后一个
2019-01-28T17:14:30.047Z
是第一个。
这是我的代码,将其插入查询语句:
if (args.after && args.before) {
where['createdAt_lte'] = args.after;
where['createdAt_gte'] = args.before;
}
console.log(where)
return await context.db.query.audits({ where }, info);
我在操场上执行此语句
getAuditLogsForUser(before: "2019-01-28T19:31:08.382Z" after: "2019-01-28T17:14:30.047Z") { id code { action } createdAt }
因此,我希望将createdAt_lte(小于或等于)设置为2019-01-28T17:14:30.047Z
,并将createdAt_gte(大于或等于)设置为2019-01-28T19:31:08.382Z
尽管我知道有结果,但是我实际上没有任何结果。
我试图在graphql网站上查找有关DateTime
标量的一些文档。我从字面上找不到任何东西,但是我在生成的prisma模式中看到了它。它只是定义为Scalar。没什么特别的。我也不认为我会在其他地方定义它。我正在使用Graphql-yoga,如果有什么区别。
(生成的pyramida文件)
scalar DateTime
我想知道它是否真的可以将其当作真正的日期时间来处理?一定是因为它是作为UTC中的DateTime ISO字符串生成的。
这时我很难理解我的问题,也许我需要以其他方式定义它?感谢您的帮助
答案 0 :(得分:0)
好,所以弄清楚这与我使用“ after”和“ before”作为参数变量这一事实有关。我不知道为什么这会完全弄乱一切,但是如果您将此作为参数,它将不会返回任何结果。很奇怪。必须以某种方式抽象一些其他变量,可能是graphql末端的一个错误。
一旦我尝试了一个新的变量名viola,它就会起作用。
答案 1 :(得分:0)
对不起,我在第一封信中误读了您的示例。这是您在操场上尝试过的正确方法吗?
getAuditLogsForUser(
before: "2019-01-28T19:31:08.382Z",
after: "2019-01-28T17:14:30.047Z"
){
id
code { action }
createdAt
}
这将无效,因为之前和之后均不涉及时间,而是用于分页的光标。他们期望一个ID。由于id也是字符串,因此此查询不会引发错误,但不会找到任何内容。分页的使用方法如下:https://www.prisma.io/docs/prisma-graphql-api/reference/queries-qwe1/#pagination
我想您要做的是在查询中使用过滤器。为此,您可以使用where参数。查询如下所示:
getAuditLogsForUser(
where:{AND:[
{createdAt_lte: "2019-01-28T19:31:08.382Z"},
{createdAt_gte: "2019-01-28T17:14:30.047Z"}
]}
) {
id
code { action }
createdAt
}
以下是过滤文档:https://www.prisma.io/docs/prisma-graphql-api/reference/queries-qwe1/#filtering