Как запросить только эти объекты, содержащие каждый элемент из массива, заданного в качестве переменной, используя Hasura? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть таблица «Студенты» в моей базе данных (postgress с Hasura) с отношением многие ко многим с «Субъектами»:

type Student = {
    id: uuid
    name: String
    subjects: [subject]
}

type Subject = {
    id: uuid
    name: String
}

У меня есть Stati c QUERY1 :

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
}

Моя проблема в том, что мне нужен другой запрос, который найдет всех учеников, которые посещают КАЖДЫЙ из этих классов.

Так что это не должно получить student1 , но следует выбирать студентов следующим образом:

const student2 = {
   id: 2,
   name: 'Walt',
   subjects: ['Math', 'English', 'Physics', 'Some', 'other', 'subjects']  // subjects mapped to names for simplicity
}

Моя единственная идея заключалась в создании динамических c запросов, таких как:
Dynami c QUERY2 (новый запрос генерируется (в время выполнения ) каждый раз, когда изменяется массив $ subject):

query FilteredStudents {
    students(where: { _and: [
        subjects: { name: { _eq: "Math" } }
        subjects: { name: { _eq: "English" } } 
        subjects: { name: { _eq: "Physics" } } 
    ]}) {
        id
        name
    }
}

Но я бы очень хотел этого избежать и найти некоторые данные c решение. Есть ли способ достичь этого, используя фильтры, предлагаемые Hasura? (https://hasura.io/docs/1.0/graphql/manual/queries/query-filters.html#)

1 Ответ

2 голосов
/ 05 мая 2020

Я могу назвать ваш QUERY2 уже как stati c, а QUERY1 - как динамический c - 1-й параметризован, 2-й жестко задан.

Вы можете создать и передать как переменную целое where объект для обоих .

Вы можете прочитать this и использовать _not с _nin, чтобы сделать то же самое (при использовании '_and'). Это будет динамическое c условие, потому что where - это тип ввода ... и почти такая же сложность создания объекта условия.

update

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 } } 
  });
});
...