【问题标题】:Sequelize join source model into target modelSequelize 将源模型连接到目标模型
【发布时间】:2017-04-13 14:49:00
【问题描述】:

我有这些模型:

module.exports = function(sequelize, DataTypes) {
    const Tool = sequelize.define('Tool', {
      Price:  {type: DataTypes.STRING(255)},
      PurchaseDate: DataTypes.DATE,
    });

  return Tool;
};

module.exports = function(sequelize, DataTypes) {
    const RepairOrder = sequelize.define('RepairOrder', {
      OrderNumber: {type: DataTypes.STRING(255)}
    }, {
      classMethods: {
        associate(models) {
          RepairOrder.belongsTo(models.Tool, {as: 'Tool'});
        }
      }
    });

  return RepairOrder;
};

module.exports = function(sequelize, DataTypes) {
  const Hammer = sequelize.define('Hammer', {
    Color: {type: DataTypes.STRING(255)}
  },
  {
    classMethods: {
      associate(models) {
        Hammer.belongsTo(models.Tool, {as: 'Tool'});
      }
    }
  });

  return Hammer;
};

module.exports = function(sequelize, DataTypes) {
  const Spanner = sequelize.define('Spanner', {
    Size: {type: DataTypes.STRING(255)}
  },
  {
    classMethods: {
      associate(models) {
        Hammer.belongsTo(models.Tool, {as: 'Tool'});
      }
    }
  });

  return Spanner;
};

因为BelongsTo 方法Hammer 和Spanner 有一个ToolID 列。 现在我想接收所有带有工具信息的维修订单,所以我将这些工具加入到维修订单中。

RepairOrder.findAll({
  attributes: ['ID', 'OrderNumber'],
  include: [{
    model: Tool, as: 'Tool'   
  }]
});

但我也想知道在选择维修订单时是哪种类型的工具(锤子或扳手),那么如何将两者都加入到工具中? 像

RepairOrder.findAll({
      attributes: ['ID', 'OrderNumber'],
      include: [{
        model: Tool, as: 'Tool',
        include: [{'JOIN ON "Hammer"."ToolID" = "Tool"."ID"'},
                  {'JOIN ON "Spanner"."ToolID" = "Tool"."ID"'}]
      }]
    });

【问题讨论】:

    标签: node.js associations sequelize.js


    【解决方案1】:

    你不能,用你目前的模型定义。您可能会收到一条错误消息,指出 Tool 未与 Hammer(或 Spanner)关联。

    因此,您应该如下修改模型定义: 在您的工具模型中,包含以下关联:

    Tool.hasMany(models.Hammer, {as: 'Tool'});
    Tool.hasMany(models.Spanner, {as: 'Tool'});
    

    在此之后,您可以通过以下方式在 Hammer 和 Spanner 上加入工具:

    RepairOrder.findAll({
        attributes: ['ID', 'OrderNumber'],
        include: {
          model: Tool, as: 'Tool',
          include: [{
            model: models.Hammer,
            as: 'Tool'
          }, {
            model: models.Spanner,
            as: 'Tool'
          }]
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2022-07-11
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多