Sequelize targetKey不工作

时间:2018-04-13 13:40:13

标签: node.js associations sequelize.js

我正在尝试使用sequelize关联两个模型“Note”和“Resource”。但是,targetKey未按预期工作。

注意模式

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('note', {
    NoteID: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    Title: {
      type: DataTypes.STRING(50),
      allowNull: true
    },
    Note: {
      type: DataTypes.STRING(500),
      allowNull: false
    },
    CreatedBy: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      references: {
        model: 'resource',
        key: 'ResourceID'
      }
    },
    UpdatedBy: {
      type: DataTypes.INTEGER(11),
      allowNull: true,
      references: {
        model: 'resource',
        key: 'ResourceID'
      }
    }
  }, {
    tableName: 'note'
  });
};

资源模式

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('resource', {
    ResourceID: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    FirstName: {
      type: DataTypes.STRING(250),
      allowNull: false
    },
    LastName: {
      type: DataTypes.STRING(250),
      allowNull: false
    }
  }, {
    tableName: 'resource'
  });
};

协会

Resource.belongsTo(Note,{
    foreignKey: 'UpdatedBy',
    as: 'Resource_Updated_Note'
});

Note.hasOne(Resource,{
    foreignKey: 'ResourceID',
    targetKey: 'UpdatedBy',
    as: 'Note_Updated_By'
});

Resource.belongsTo(Note,{
    foreignKey: 'CreatedBy',
    as: 'Resource_Created_Note'
});

Note.hasOne(Resource,{
    foreignKey: 'ResourceID',
    targetKey: 'CreatedBy',
    as: 'Note_Created_By'
});

虽然我在关联时提到了targetKey,但是在加入表时它会使用PrimaryKey。

执行

Note.findAll({
        include: [{
            model: Resource,
            as: 'Note_Updated_By'
        }],
        where: {
            Status: {
                [SQLOP.or]: ['Active', 'ACTIVE']
            }
        }
    }).then(function (response) {
        callback(response);
    });

根据执行情况,生成此选择查询。

SELECT * FROM `note` LEFT OUTER JOIN `resource` AS `Note_Updated_By` ON `note`.`NoteID` = `Note_Updated_By`.`ResourceID`;

而不是noteNoteID,应该是noteUpdatedBy

2 个答案:

答案 0 :(得分:1)

"sequelize": "^5.8.12"开始使用新版本 对于sourceKey使用targetKey代替hasOne,并且hasMany关系对我有用。

ModelName.hasOne(ModelName1, {
  as: 'SomeAlias',
  foreignKey: 'foreign_key',
  onDelete: 'NO ACTION',
  onUpdate: 'NO ACTION',
  sourceKey: 'YOUR_CUSTOM_ASSOCIATION_KEY'
});

答案 1 :(得分:0)

对于将来的访问者,截至2018年8月,这仍然是known issue,带有续集。