Агрегатная функция возвращает ноль GraphQL - PullRequest
0 голосов
/ 16 мая 2018

Я тестирую базовую функцию агрегирования, используя подсчеты из Sequelize, и вот мой тип Подсчеты :

type Creserve {
    id: ID!
    rDateStart: Date!
    rDateEnd: Date!
    grade: Int!
    section: String!
    currentStatus: String!
    user: User! 
    cartlab: Cartlab! 
}
type Counts {
    section: String!
    count: Int
}
type Query {
    getBooking(id: ID!): Creserve!
    allBookings: [Creserve]
    getBookingByUser(userId: ID): Creserve
    upcomingBookings: [Creserve]  
    countBookings: [Counts]
}

Я использую countBookings в качестве запроса для агрегатных функций, и вот мой преобразователь для запроса:

countBookings: async (parent, args, {models}) => 
    {
      const res = await models.Creserve.findAndCountAll({
        group: 'section',
        attributes: ['section', [Sequelize.fn('COUNT', 'section'), 'count']]
      });
        return res.rows;
  },

Запрос, который он выводит, таков:

Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";

И попробовал этот запрос в моей оболочке psql, и он работает нормально:

 section | count
---------+-------
 A       |     2
 R       |     2

Однако, когда я попытался запросить countBookings на моей GraphQL Playground, возвращается раздел, но не счетчик:

    {
  "data": {
    "countBookings": [
      {
        "section": "A",
        "count": null
      },
      {
        "section": "R",
        "count": null
      }
    ]
  }
}

Есть что-то, что я пропустил? Или это ошибка? Вот ответ, который я попытался выполнить в следующем примере: https://stackoverflow.com/a/45586121/9760036

Большое спасибо!

edit: возвращая console.log (res.rows) выводит что-то вроде этого:

   [ Creserve {
    dataValues: { section: 'A', count: '2' },
    _previousDataValues: { section: 'A', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       hooks: [Object],
       sequelize: [Sequelize],
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  Creserve {
    dataValues: { section: 'R', count: '2' },
    _previousDataValues: { section: 'R', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       hooks: [Object],
       sequelize: [Sequelize],
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false } ]

Вот для res.count:

Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";
[ { count: '2' }, { count: '2' } ]

1 Ответ

0 голосов
/ 16 мая 2018

Задача

На самом деле вы делаете все прямо здесь ... но здесь происходит то, что sequlize не возвращает простой объект ... Он всегда возвращает данные в виде instance, как этот

[ Creserve {
    dataValues: { section: 'A', count: '2' },
    _previousDataValues: { section: 'A', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,

Решение

Я не уверен, но нет другого пути, кроме циклов и делает ответ на объект json ...

const array = []
res.rows.map((data) => {
  array.push(data.toJSON())
})
return array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...