【问题标题】:Only return specified associated model from sequelize junction model仅从 sequelize junction 模型返回指定的关联模型
【发布时间】:2020-07-03 06:21:20
【问题描述】:

我正在尝试正确使用 sequelize 查询来处理 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
  }

模型关联

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

所以这两个模型通过一个名为 UserPool 只存储UserPool 的pks。

在我的./resolvers/pool.js 中,我正在为Pool 定义我的gql 模型解析器。 这就是我的问题所在。 在下面的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 模型关联定义:

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

【问题讨论】:

    标签: node.js postgresql graphql sequelize.js apollo


    【解决方案1】:

    我尝试使用 Sequelize 中的 auto 方法,但它们似乎不起作用。

    你可以这样做:

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

    【讨论】:

      【解决方案2】:

      poolUsers 是一个 UserPool 对象数组,因此它没有 getUsers 方法。您可以映射每个 UserPool 并获取用户,但这会导致不必要地大量调用您的数据库。

      您已在 PoolUser 之间创建关联。所以你可以这样做

      members: async (pool) => {
        return pool.getUsers()      
      }
      

      【讨论】:

      • 其实我才意识到这一点。我在我的models/pool.js 文件中定义了一个无关的关联:facepalm:但是是的,这是正确的。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2020-02-03
      相关资源
      最近更新 更多