Резолвер в graphql по отношению

Я хотел бы выполнить этот запрос, чтобы иметь все ведра с определенным языком:

{
   buckets{
      id,
      code,
      language(id:1){
         code
      }
   }
}

Но у меня есть такой ответ:

{
  "data": {
    "buckets": [
      {
        "id": 1,
        "language": {
          "code": "FR"
        }
      },
      {
        "id": 2,
        "language": {
          "code": "FR"
        }
      },
      {
        "id": 3,
        "language": "FR" <= Real value "EN"
      },
      {
        "id": 4,
        "language": "FR" <= Real value "EN"
      }
    ]
  }
}

Я хотел бы, чтобы было выбрано только ведро с идентификатором языка:

{
  "data": {
    "buckets": [
      {
        "id": 1,
        "language": {
          "code": "FR"
        }
      },
      {
        "id": 2,
        "language": {
          "code": "FR"
        }
      }
    ]
  }
}

схема.js

import { gql } from 'apollo-server';

export const typeDefs = gql`

  # Language
  type Language {
    id: Int!
    name: String
    code: String
    is_active: Boolean
  }

  # Bucket
  type Bucket {
    id: Int!,
    code: String
    language(id: Int): Language
  }

  # query for types
  type Query {
    buckets: [Bucket]
  }

  schema {
    query: Query
  }
`;

export default typeDefs;

разрешители.js

import GraphQLDate from 'graphql-date';
import { Bucket, Language } from './connectors';

export const resolvers = {
    Date: GraphQLDate,
    Query: {
        buckets(_, args) {
            return Bucket.findAll({
                where: args,
                order: [['created_at', 'DESC']],
            });
        }
    },
    Bucket: {
       language(bucket, {id}) {
           console.info('resolver id', id);
           const where = {id: bucket.fk_language_id };

           if (id) {
               where.id = id
           }

           return Language.findOne({
               where: where,
           });
       },
   }
};

export default resolvers;

коннекторы.js

...

// define language
const LanguageModel = db.define('language', {
    name     : {type: Sequelize.STRING},
    code     : {type: Sequelize.STRING},
    is_active: {type: Sequelize.BOOLEAN}
});

// define bucket
const BucketModel = db.define('bucket', {
    code     : {type: Sequelize.STRING},
    is_active: {type: Sequelize.BOOLEAN}
});

BucketModel.belongsTo(LanguageModel, {
    foreignKey: 'fk_language_id'
});

LanguageModel.hasMany(BucketModel, {
    foreignKey: 'id'
});

...

Моя база данных очень проста, всего две таблицы Language и Bucket.

База данных

Язык

id | name | code | is_active

Ведро

id | fk_language_id | code | created_at | updated_at

С этим запросом:

{
buckets{
    id,
  language{
    code
  }
  }
}

У меня есть этот результат:

{
  "data": {
    "buckets": [
      {
        "id": 1,
        "language": {
          "code": "FR"
        }
      },
      {
        "id": 2,
        "language": {
          "code": "FR"
        }
      },
      {
        "id": 3,
        "language": {
          "code": "EN"
        }
      },
      {
        "id": 4,
        "language": {
          "code": "EN"
        }
      }
    ]
  }
}

вы уверены, что это происходит, когда вы включаете идентификатор в запрос? ``` если (id) { где.id = id } ```

masmerino 26.03.2019 18:09

Вы получаете «id» в своем распознавателе? Потому что я не вижу никакого «ввода» в схеме.

Amit Bhoyar 26.03.2019 18:10

@masmerino Я обновил свой код простым запросом без определенного идентификатора языка

Jérémie Chazelle 26.03.2019 18:12

давайте проведем быстрый тест: не могли бы вы изменить свой запрос на него: { Buckets(filter: language: {id: 1}){ id, language {code} } }

masmerino 26.03.2019 18:26

Prisma и grapql таким образом поддерживают классные фильтры :)

masmerino 26.03.2019 18:27

@masmerino Я пытался выполнить {bucks(filter: language: {id: 1}){id, language{code} } }, но ничего, запрос не запускается

Jérémie Chazelle 26.03.2019 18:33

давай, я попробую что-нибудь еще

masmerino 26.03.2019 18:35

@AmitBhoyar в моей схеме у меня есть это: type Bucket {id: Int!, code: String language(id: Int): Language}

Jérémie Chazelle 26.03.2019 18:39

@JérémieChazelle, на данный момент не уверен, но, упустив из виду, я думаю, вы хотите фильтровать по списку сегментов, а не по списку языков, поэтому, где должно быть предложение в Bucket.findAll({where:{id: yourId}}). Также схема должна отправлять фильтр на верхний уровень (сегмент).

Amit Bhoyar 26.03.2019 21:34

@AmitBhoyar, у вас есть пример с кодом, пожалуйста?

Jérémie Chazelle 26.03.2019 21:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
10
239
0

Другие вопросы по теме