如何使用 Hasura 仅查询包含作为变量给出的数组中每个元素的这些对象?
How to query only these object containing each element from the array given as a variable using Hasura?
我的数据库中有一个 table 'Students'(与 Hasura 的 postgress)与 'Subjects':
的多对多关系
type Student = {
id: uuid
name: String
subjects: [subject]
}
type Subject = {
id: uuid
name: String
}
我有一个静态查询1:
query FilteredStudents($subjects: [String!]) {
students(where: { subjects: { name: { _in: $subjects } } }) {
id
name
}
}
例如:
$subjects = ['Math', 'English', 'Physics']
它将找到所有参加 类 课程的学生。
例如:
const student1 = {
id: 1,
name: 'Mike',
subjects: ['Physics', 'Chemistry'] // subjects mapped to names for simplicity
}
我的问题是我想要另一个查询,该查询将找到参加 EACH 的所有学生 类.
所以它不应该获取 student1,而应该像这样获取学生:
const student2 = {
id: 2,
name: 'Walt',
subjects: ['Math', 'English', 'Physics', 'Some', 'other', 'subjects'] // subjects mapped to names for simplicity
}
我唯一的想法是创建这样的动态查询:
Dynamic QUERY2(每次 $subject 数组更改时都会生成一个新查询(在 runtime 上)):
query FilteredStudents {
students(where: { _and: [
subjects: { name: { _eq: "Math" } }
subjects: { name: { _eq: "English" } }
subjects: { name: { _eq: "Physics" } }
]}) {
id
name
}
}
但我真的很想避免这种情况并找到一些静态解决方案。有没有办法使用 Hasura 提供的过滤器来实现这一目标? (https://hasura.io/docs/1.0/graphql/manual/queries/query-filters.html#)
我可以将您的 QUERY2 命名为静态的,将 QUERY1 命名为动态的 - 第一个是参数化的,第二个是硬编码的。
您可以为两者构建并作为变量传递整个 where
对象。
您可以阅读 this 并使用 _not
和 _nin
来做同样的事情(作为 '_and' 用法)。它仍然是一个动态条件,因为 where
是一个输入类型 ...并且几乎相同的条件对象创建复杂性。
更新
const subset = ['Math', 'English'];
const condition = { _and: [] };
subset.map( el => {
condition._and.push( {
subjects: { name: { _eq: el } }
});
});
callSomeLazyQuery( { variables: {
where: condition
} );
同样应该有效
const condition = {
_not: {
_and: []
}
};
subset.map( el => {
condition._not._and.push( {
subjects: { name: { _nil: el } }
});
});
我的数据库中有一个 table 'Students'(与 Hasura 的 postgress)与 'Subjects':
的多对多关系type Student = {
id: uuid
name: String
subjects: [subject]
}
type Subject = {
id: uuid
name: String
}
我有一个静态查询1:
query FilteredStudents($subjects: [String!]) {
students(where: { subjects: { name: { _in: $subjects } } }) {
id
name
}
}
例如:
$subjects = ['Math', 'English', 'Physics']
它将找到所有参加 类 课程的学生。 例如:
const student1 = {
id: 1,
name: 'Mike',
subjects: ['Physics', 'Chemistry'] // subjects mapped to names for simplicity
}
我的问题是我想要另一个查询,该查询将找到参加 EACH 的所有学生 类.
所以它不应该获取 student1,而应该像这样获取学生:
const student2 = {
id: 2,
name: 'Walt',
subjects: ['Math', 'English', 'Physics', 'Some', 'other', 'subjects'] // subjects mapped to names for simplicity
}
我唯一的想法是创建这样的动态查询:
Dynamic QUERY2(每次 $subject 数组更改时都会生成一个新查询(在 runtime 上)):
query FilteredStudents {
students(where: { _and: [
subjects: { name: { _eq: "Math" } }
subjects: { name: { _eq: "English" } }
subjects: { name: { _eq: "Physics" } }
]}) {
id
name
}
}
但我真的很想避免这种情况并找到一些静态解决方案。有没有办法使用 Hasura 提供的过滤器来实现这一目标? (https://hasura.io/docs/1.0/graphql/manual/queries/query-filters.html#)
我可以将您的 QUERY2 命名为静态的,将 QUERY1 命名为动态的 - 第一个是参数化的,第二个是硬编码的。
您可以为两者构建并作为变量传递整个 where
对象。
您可以阅读 this 并使用 _not
和 _nin
来做同样的事情(作为 '_and' 用法)。它仍然是一个动态条件,因为 where
是一个输入类型 ...并且几乎相同的条件对象创建复杂性。
更新
const subset = ['Math', 'English'];
const condition = { _and: [] };
subset.map( el => {
condition._and.push( {
subjects: { name: { _eq: el } }
});
});
callSomeLazyQuery( { variables: {
where: condition
} );
同样应该有效
const condition = {
_not: {
_and: []
}
};
subset.map( el => {
condition._not._and.push( {
subjects: { name: { _nil: el } }
});
});