Возвращать только указанную связанную модель из модели секвестрирования - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь правильно использовать запросы на продолжение для работы с graphql + apollo.

Вот моя Pool gql схема:

  type Pool {
    id: ID!
    name: String!
    createdBy: User
    members: [User]
  }

Вот ассоциация модели пула

  Pool.associate = models => {
    Pool.belongsToMany(models.User, {
      onDelete: 'CASCADE',
      through: models.UserPool,
      foreignKey: models.UserPool.poolId,
    })
  }

Аналогично для User Схема:

  type User {
    id: ID!
    username: String!
    email: String!
    role: String
  }

модель ассо c

  User.associate = models => {
    User.belongsToMany(models.Pool, {
      onDelete: 'CASCADE',
      through: models.UserPool,
      foreignKey: 'userId',
    })
  }

Таким образом, эти две модели имеют: m связь через модель соединения, называемую UserPool, которая просто хранит pks для User и Pool.

В моем ./resolvers/pool.js я определяю свой преобразователь модели gql для Pool. Вот где моя проблема. В приведенном ниже поле members я просто хочу вернуть массив объекта User, к которому я могу получить доступ через UserPool

  Pool: {
    createdBy: async (pool, _, { models }) => {
      // this sequelize built-in works and returns the createdBy User model
      const user = await pool.getUser()
      return user
    },
    members: async (pool, _, { models }) => {
      let users = []

      const poolUsers = await models.UserPool.findAll({
        where: { poolId: pool.id },
      })


      // *** below is what I want to do -- use the in-built ***
      // *** sequelize query methods you get with the n:m assoc ***

      const users = await poolUsers.getUsers()

      // However, each time this throws an error: 
      // getUsers() is not a function....

      return users
    },
  },

Просто для того, чтобы покрыть и мои базы, вот моя ассоциация модели UserPool def:

  UserPool.associate = models => {
    UserPool.belongsTo(models.User, {
      onDelete: 'CASCADE',
      foreignKey: 'userId',
    })
    UserPool.belongsTo(models.Pool, {
      onDelete: 'CASCADE',
      foreignKey: 'poolId',
    })
  }

Ответы [ 2 ]

1 голос
/ 22 марта 2020

poolUsers - это массив объектов UserPool, поэтому у него нет метода getUsers. Вы можете отобразить каждый UserPool и получить пользователей, но это приведет к излишне большому количеству вызовов в вашу базу данных.

Вы создали связь между Pool и User. Так что вместо этого вы можете просто сделать

members: async (pool) => {
  return pool.getUsers()      
}
0 голосов
/ 22 марта 2020

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

Вы можете просто сделать:

models.User.findAll({
        include: [{
            model: models.UserPool,
            where: { poolId: pool.id },
            required: true
        }]
...