仅从 sequelize junction 模型返回指定的关联模型

Posted

技术标签:

【中文标题】仅从 sequelize junction 模型返回指定的关联模型【英文标题】:Only return specified associated model from sequelize junction model 【发布时间】: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',
    )
  

【问题讨论】:

【参考方案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:但是是的,这是正确的。谢谢!

以上是关于仅从 sequelize junction 模型返回指定的关联模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sequelize 仅从行和关联中获取值

Sequelize 模型重复值检查

同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)

Sequelize 模型关联不会创建新列

Sequelize:在生产中更改模型架构

GraphQl,Sequelize-CLi,模型捆绑器 - sequelize.import 不是函数