【问题标题】:sequelize belongsToMany where filtersequelize belongsToMany where filter
【发布时间】:2019-03-13 12:06:13
【问题描述】:

假设我有以下模型:

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。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我想我已经掌握了窍门。至少它做了一些事情。如果我像你说的那样做它会给出一个错误,虽然“Item.vatKeyId”没有定义,但它确实在我的数据库中,它只是另一个简单的 belongsTo 关联......models.Item.belongsTo(models.VatKey);
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2017-08-15
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多