Node.js 获取给定一个匹配项的所有关联记录

Node.js 获取给定一个匹配项的所有关联记录,node.js,sequelize.js,Node.js,Sequelize.js,我有两个一对多关系的模型。假设下面的查询返回ModelA的记录(假设它有id 1)和3个关联的ModelB(1、2和3) 如果我将查询中的[1,2,3]替换为[1],它仍然会返回相同的ModelA记录(id为1),但只返回一个关联的ModelB(id为1)。如何修改此查询以使其返回所有三个关联的ModelB记录 ModelA.findAll({ include: [{ model: JoinTableModel, where: { modelB_ID: {

我有两个一对多关系的模型。假设下面的查询返回ModelA的记录(假设它有id 1)和3个关联的ModelB(1、2和3)

如果我将查询中的[1,2,3]替换为[1],它仍然会返回相同的ModelA记录(id为1),但只返回一个关联的ModelB(id为1)。如何修改此查询以使其返回所有三个关联的ModelB记录

ModelA.findAll({
  include: [{
    model: JoinTableModel,
    where: {
      modelB_ID: {
        [Op.in]: [1,2,3]
      }
    },
    include: [ModelB]
  }]
})
像这样的模型定义

db.ModelA.hasMany(db.JoinTableModel, { foreignKey: 'modelA_ID' })
db.JoinTableModel.belongsTo(db.ModelA, { foreignKey: 'modelA_ID' })

db.ModelB.hasMany(db.JoinTableModel, { foreignKey: 'modelB_ID' })
db.JoinTableModel.belongsTo(db.ModelB, { foreignKey: 'modelB_ID' })

您可以尝试以下方法:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [{
      model: JoinTableModel,
      include: [ModelB]
    }]
  }]
})
ModelA.belongsToMany(ModelB, { through: JoinTableModel })
如果添加如下关联:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [{
      model: JoinTableModel,
      include: [ModelB]
    }]
  }]
})
ModelA.belongsToMany(ModelB, { through: JoinTableModel })
然后您可以将上述查询简化为以下查询:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [ModelB]
  }]
})

您可以尝试以下方法:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [{
      model: JoinTableModel,
      include: [ModelB]
    }]
  }]
})
ModelA.belongsToMany(ModelB, { through: JoinTableModel })
如果添加如下关联:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [{
      model: JoinTableModel,
      include: [ModelB]
    }]
  }]
})
ModelA.belongsToMany(ModelB, { through: JoinTableModel })
然后您可以将上述查询简化为以下查询:

JoinTableModel.findAll({
  where: {
    modelB_ID: {
      [Op.in]: [1]
    }
  },
  include: [{
    model: ModelA,
    include: [ModelB]
  }]
})

对于任何和我有类似问题的人来说,我最终要做的是修改我的初始查询,就像这样

ModelA.findAll({
  where: {
    id: sequelize.literal(`
      ModelA.id 
      IN (
        SELECT modelA_ID FROM JoinTableModel
        WHERE modelB_ID IN (1,2,3)
        GROUP BY modelA_ID
        HAVING COUNT(*) = 3
      )`)
  },
  include: [{
    model: JoinTableModel,
    include: [ModelB]
  }]
})
通过这种方式,我可以轻松地将(1,2,3)中的
COUNT(*)3中的
替换为(1)中的
COUNT(*)1中的
,它仍然可以按预期工作,并且不会破坏查询的任何其他部分


我仍然很好奇,是否有人可以不用sequelize.literal来解决这个问题,或者是否有更有效的方法来解决这个问题。

对于像我这样有类似问题的人,我最终为我的案例所做的工作就是这样修改我的初始查询

ModelA.findAll({
  where: {
    id: sequelize.literal(`
      ModelA.id 
      IN (
        SELECT modelA_ID FROM JoinTableModel
        WHERE modelB_ID IN (1,2,3)
        GROUP BY modelA_ID
        HAVING COUNT(*) = 3
      )`)
  },
  include: [{
    model: JoinTableModel,
    include: [ModelB]
  }]
})
通过这种方式,我可以轻松地将(1,2,3)中的
COUNT(*)3中的
替换为(1)中的
COUNT(*)1中的
,它仍然可以按预期工作,并且不会破坏查询的任何其他部分


我仍然很好奇,是否有人可以不用任何方式使用sequelize.literal来解决这个问题,或者是否有更有效的方法来解决这个问题。

显示所有三个模型定义及其关联definitions@Anatoly更新了模型定义问题,至少您应该移动
包括:[ModelB]
到更高的一行
包括JoinTableModel@Anatoly哦,当我把它贴在这里的时候,我错过了一些括号,它被编辑了。好的。因此,在JoinTableModel 1,1,2和1,3中有一个id为1的ModelA和三个id为1,2,3的ModelB以及三条记录。对吗?那么你想达到什么目的呢?是否希望获取与特定ModelA链接的所有ModelB,该ModelA具有与给定ModelB的链接(例如ModelB=1)?显示所有三个模型定义及其关联definitions@Anatoly更新了模型定义问题,至少您应该移动
包括:[ModelB]
到更高的一行
包括JoinTableModel@Anatoly哦,当我把它贴在这里的时候,我错过了一些括号,它被编辑了。好的。因此,在JoinTableModel 1,1,2和1,3中有一个id为1的ModelA和三个id为1,2,3的ModelB以及三条记录。对吗?那么你想达到什么目的呢?是否希望获取与某个特定ModelA链接的所有ModelB,该ModelA与给定ModelB有链接(例如ModelB=1)?将尝试此操作。尽管我的初始查询比我发布的要复杂一些(例如,它包含了一个与ModelB非常相似的关联)。我会看看我是否可以采取这一点,并调整它,使其工作为我的用例,非常有用的任何一种方式,谢谢!我要试试这个。尽管我的初始查询比我发布的要复杂一些(例如,它包含了一个与ModelB非常相似的关联)。我会看看我是否可以采取这一点,并调整它,使其工作为我的用例,非常有用的任何一种方式,谢谢!