将连接源模型续订到目标模型中

时间:2017-04-13 14:49:01

标签: node.js associations sequelize.js

我有这些模特:

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"'}]
      }]
    });

1 个答案:

答案 0 :(得分:0)

你不能,用你现在的模型定义。您可能会收到一条错误消息,指出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'
      }]
    }
});