在REST URL中使用OR运算符进行Directus筛选



我有以下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

最新更新