GRAPHQL находит элементы на основе Enum

Я пытаюсь найти результаты, соответствующие определенному перечислению, это мой type:

type User {
  id: ID! @id
  fname:String!
  lname:String!
  email:String! @unique
  password: String
  school_ID: String #@relation(Link: INLINE)
  role: [Role] @scalarList(strategy: RELATION)
  resetToken: String
  resetTokenExpiry: String
}

Я могу искать электронную почту, потому что в ней есть @unique ключ, но Role - это перечисление, и я не могу добавить к нему @unique ключ, и это имеет смысл, потому что результаты не будут уникальными.

Однако я продолжаю получать это сообщение:

"Переменная \" $ _ v0_where \ "получила недопустимое значение {\" role \ ": \" TEACHER \ "}; Поле \" role \ "не определено типом UserWhereUniqueInput."

Использование электронной почты дает мне желаемый результат, если я хочу использовать электронную почту для поиска элементов.

Мне нужно получить возврат массива со всеми объектами, соответствующими выбранному результату перечисления.

В моей схеме есть это:

users: [User]!
user(where: UserWhereInput!): User
findUser(role: Role, id: ID, email: String): User

В моих преобразователях запросов я играю со следующим:

  users: forwardTo('db'),
  user: forwardTo('db'),

  async findUser(parent, args, ctx, info) {
    return ctx.db.query.user({
      where: {email: args.email, id: args.id, role: args.role}
    }, info)
  },

Я использую prisma (1.17.1) для создания своих схем

Как мне изменить свой код или функцию findUser, чтобы получить желаемый результат?


person jwknz    schedule 09.02.2020    source источник
comment
Этот вопрос, похоже, относится к Prisma, а не к GraphQL или Apollo. Вам следует соответствующим образом обновить свои теги и указать, какую версию Prisma вы используете.   -  person Daniel Rearden    schedule 09.02.2020
comment
@DanielRearden готово :-) - Я все еще думаю, что это связано с GraphQL, хотя, поскольку я сортирую свою схему   -  person jwknz    schedule 09.02.2020


Ответы (1)


Вы используете функцию ctx.db.query.user со следующей подписью:

user: (where: UserWhereUniqueInput) => UserNullablePromise;

Как видите, для этого требуется тип UserWhereUniqueInput, где condition. Почему? Поскольку пользовательская функция всегда должна возвращать только один отдельный уникальный объект. С другой стороны, есть еще ctx.db.query.users функция:

  users: (args?: {
    where?: UserWhereInput;
    orderBy?: UserOrderByInput;
    skip?: Int;
    after?: String;
    before?: String;
    first?: Int;
    last?: Int;
  }) => FragmentableArray<User>;

Как видите, эта функция имеет больше параметров и использует UserWhereInput для определения условия where. Это также будет включать роль пользователя в вашем случае. Эта функция может возвращать несколько объектов, и вы должны соответственно фильтровать / обрабатывать.

Подсказка: вы также можете самостоятельно проверить созданный клиент призмы. Путь обычно имеет вид src\generated\prisma-client\index.ts. Там вы можете увидеть определения интерфейсов всех функций, например, UserWhereUniqueInput, а также UserWhereInput. Таким образом вы можете проверить, что возможно, а что нет.

person realAlexBarge    schedule 10.02.2020