我有以下url
/items/bus_stops_bus_drivers?filter[bus_drivers_id][_eq]=2&filter[bus_stops_id][_eq]=3
我使用&
将两个滤波器与一个AND
连接起来。OR
运算符应该使用什么字符?
一般来说REST和URI查询:
没有标准的查询语言,你需要发明自己的语言并为其编写解析器。通常,URI查询只是一个过滤器数组,在你的情况下:
{
filter: {
bus_drivers_id: {_eq: 2},
bus_stops_id: {_eq: 3}
}
}
我建议您使用数组结构,而不是自定义查询结构,因为已有一个URI查询解析器。因此,不要使用a or b
,只需执行类似or(a,b)
的操作即可。
{
filter: {
_or: [
{
bus_drivers_id: {_eq: 2},
bus_stops_id: {_eq: 3}
},
{
bus_drivers_id: {_eq: 4},
}
]
}
}
翻译成
/items/bus_stops_bus_drivers?
filter[_or][1][bus_drivers_id][_eq]=2
&filter[_or][1][bus_stops_id][_eq]=3
&filter[_or][2][bus_drivers_id][_eq]=4
另一种选择是使用已经存在的URI查询语言,如RQL:https://github.com/persvr/rql尽管在这种情况下,最好发送纯JSON,而不是像这样的问题
/items/bus_stops_bus_drivers?filter={URI-encoded-JSON}
如果您需要非常复杂的东西,另一种选择是使用类似OData的标准:http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#_Toc31360954或者GraphQL是一个非REST替代方案。
Directus案例:
Directus的情况很有趣,如果您给定多个参数,它们默认使用逻辑AND,并且根据github问题,它们有一种特殊的方式来给定逻辑OR:https://github.com/directus/v8-archive/issues/1402目前,它似乎也包含一个错误。
这是他们的示例查询:
{ENDPOINT}}/_/items/banner_item?
filter[content_max_age][0][null]
&filter[content_max_age][1][logical]=or
&filter[content_max_age][1][gte]=2020-02-19
如果我们将其转换为JSON:
{
filter: {
content_max_age: [
{_null: ""},
{logical: "or", _gte: "2020-02-19"}
]
}
}
而通常我们会期待这样的东西:
{
filter: {
content_max_age: {
_or: [
{_null: ""},
{_gte: "2020-02-19"}
]
}
}
}
这在理论上也应该起作用。
Directus操作符在这里,但从这个角度来看,它们的文档记录得很差,我的意思是,我甚至不确定如何根据这个文档使用_null
,我只是在上面的代码中猜测到:https://docs.directus.io/reference/filter-rules.html
我不认为您可以使用REST API在URI查询中发送JSON类型过滤器,但不确定为什么它不受支持。根据本文,您需要使用GraphQL和POST:https://learndirectus.com/how-to-filter-the-directus-api/不过,如果您坚持使用REST,那么上层URI查询解决方案应该可以工作。
理论上,总线驱动程序URI应该是这样的,但我不能完全确定。
/items/bus_stops_bus_drivers?
filter[0][bus_drivers_id][_eq]=2
&filter[0][bus_stops_id][_eq]=3
&filter[1][logical]=or
&filter[1][bus_drivers_id][_eq]=4