sequelize AresToMany where过滤器

时间:2018-10-08 19:13:47

标签: javascript sql node.js sequelize.js hapi

假设我有以下模型:

const Item = sequelize.define("Item", {
    active: { type: DataTypes.BOOLEAN, defaultValue: true },
    name: { type: DataTypes.STRING, allowNull: false },
    description: { type: DataTypes.TEXT } 
  });


const Partner = sequelize.define("Partner", {
    active: { type: DataTypes.BOOLEAN, defaultValue: true },
    name: { type: DataTypes.STRING, allowNull: false },
  });

我通过以下方式将它们关联:

models.Item.belongsToMany(models.Partner, {
      as: "vendors",
      through: "PartnerDefaultItems"
    });

models.Partner.belongsToMany(models.Item, {
      as: "items",
      through: "PartnerDefaultItem"
    });

我想我的模型和关联还可以,因为它将在数据库中创建带有项目和合作伙伴ID的新表。

现在!我正在通过过滤进行服务器端分页,当我选择一个或多个伙伴时,我只想返回与所选伙伴关联的那些项目。

我可以只执行一个查询吗?

例如:我的前端发送一个带有partnerId:1 ...

的请求
const res = await db.models.Item.findAll({
          where: {select every item with associated partnerId}
        });

//-关联表示例-//

partner_id:1 item_id:1 => partner.partnerId等于partner_id,因此请选择item.id = item_id

partner_id:2 item_id:2 => partner.partnerId不等于,请勿选择

等...

重点是对此使用单个查询,而没有任何原始sql。

1 个答案:

答案 0 :(得分:0)

您的查询结构应include相关表,并为您的through指定where关系和partnerId。您可以启用logging: true在控制台中显示SQL查询以进行进一步调试。

const res = await db.models.Item.findAll({
  include: [
    {
      model: db.models.Parter,
      as: 'partners',
      through: 'PartnerDefaultItem',
      where: {
        id: partnerId,
      },
    },
  ],
});