我的查询过滤器
export const resolvers = {
Query: {
allItems: (_, { value }) => getAllLinks()
.then(result => filter(result, val => val.custom_attributes
.find(customVal =>
customVal.attribute_code === 'category_ids' && isEqual(customVal.value, value)
)
)),
},
我的架构
const typeDefs = `
type Item {
id: ID!
name: String
price: Float
custom_attributes: [CUSTOM_ATTRIBUTES]
}
union CUSTOM_ATTRIBUTES = CustomString | CustomArray
type CustomString {
attribute_code: String
value: String
}
type CustomArray {
attribute_code: String
value: [String]
}
type Query {
allItems(value : [String]): [Item]!
}
`;
现在(我认为)我的过滤器在mysql中用作AND
条件
例如,我有3个字段
首先
{
value: ["3", "5"]
}
第二
{
value: ["3", "5", "7"]
}
第三
{
value: ["3"]
}
我在参数中的变量是["3"]
因为我使用的是isEqual函数,所以它只返回第三个字段。这是不正确的,因为["3"]
在所有三个字段中。还有来自lodash的另一个功能可以解决这个小问题吗?
答案 0 :(得分:2)
根据您想要达到的目标,有两种不同的解决方案。
对于value
数组始终包含1个元素的简单情况,两个选项都有效。
我将使用此参数来显示差异:["3", "7"]
如果您希望获得所有3个字段,因为数组中至少有一个项目(在这种情况下为"3"
)在变量和customVal.value
中找到,那么您应使用lodash's intersection并检查结果是否为空数组。类似的东西:
intersection(customVal.value, value).length > 0
如果在customVal.value
和value
中同时找到至少一个项,则此表达式为真。
如果使用我的示例,您希望仅获得第二个字段,因为必须在变量和customVal.value
中找到数组中的所有项目,然后您应该使用lodash's difference并检查结果是否为空数组。类似的东西:
difference(value, customVal.value).length === 0
在这种情况下参数的顺序很重要。
如果在value
中也找到customVal.value
中的所有项,则此表达式为true。 customVal.value
中的其他值不会被difference
返回,因为我们使用value
作为第一个参数。
(使用intersection
也可以实现此选项,并将结果的长度与参数的数组长度进行比较)