如何使用Sequelize ORM“包含”两个相同模型的单独引用?

时间:2016-05-01 16:42:26

标签: sequelize.js

我正在使用MEAN堆栈构建一个网站,但用PostGRES替换MongoDB,结果使用Sequelize ORM。

我有两个模型 - UserAudioConfigUserAudioConfig可以AudioConfig User createdBy updatedBy属于models.User.hasMany(models.AudioConfig, { foreignKey: { name: 'createdBy', allowNull: false } }); models.User.hasMany(models.AudioConfig, { foreignKey: { name: 'updatedBy' } }); models.AudioConfig.belongsTo(models.User, { foreignKey: { name: 'createdBy', as: 'createdBy', allowNull: false } }); models.AudioConfig.belongsTo(models.User, { foreignKey: { name: 'updatedBy', as: 'updatedBy' } });

以下是我的关联使用Sequelize

的方式
findAll

在我对AudioConfig的{​​{1}}查询中,我尝试了一些与我在网上找到的不同的内容,但似乎没有一个像我期望的那样工作:

var Db = require('../../models');
var entityModel = Db.AudioConfig;

exports.index = function (req, res) {
  entityModel.findAll({
      include: {all:true}
    })
    .then(function (entities) {
      return res.status(200).json(entities);
    })
    .catch(function (err) {
      return handleError(res, err);
    })
};

// And I've tried this...
exports.index = function (req, res) {
  entityModel.findAll({
      include: [
        {model: Db.User, as: 'createdBy'},
        {model: Db.User, as: 'updatedBy'}
      ]
    })
    .then(function (entities) {
      return res.status(200).json(entities);
    })
    .catch(function (err) {
      return handleError(res, err);
    })
};

// And this too...
exports.index = function (req, res) {
  entityModel.findAll({
      include: [
        {
          model: Db.User
        }
      ]
    })
    .then(function (entities) {
      return res.status(200).json(entities);
    })
    .catch(function (err) {
      return handleError(res, err);
    })
};

现在,在我的数据库中,我有AudioConfig的单个记录,其中包含两个User引用 - 一个用于createdBy,另一个用于updatedBy。但是当我对AudioConfig进行查询时,我只返回User字段的updatedBy条记录。

[
  {
    "id": "e3011e31-b907-47ad-99f3-61016283a523",
    "sampleRate": 16000,
    "format": "WAV",
    "channel": 2,
    "bitRate": 16,
    "createdAt": "2016-05-01T16:30:11.847Z",
    "updatedAt": "2016-05-01T16:30:11.847Z",
    "createdBy": "1375263f-a3f0-4eef-800f-99b28fdce9d8",
    "updatedBy": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
    "User": {
      "id": "5bb8cac0-b916-4000-81fe-9b1f8f597847",
      "email": "johnd@email.com",
      "firstName": "John",
      "lastName": "Doe",
      "resetPasswordToken": null,
      "resetPasswordTokenExpiresOn": null,
      "createdAt": "2016-05-01T16:30:11.816Z",
      "updatedAt": "2016-05-01T16:30:11.816Z",
      "roleId": "10ae3879-9f9f-4370-aa47-3677c492afd8"
    }
  }
]

如何获取它以便将createdBy UUID值替换为与其关联的User对象?同样适用于updatedBy字段?

我有点期待与MongoDB and Mongoose's populate

相同的行为

1 个答案:

答案 0 :(得分:5)

我终于意识到问题是什么,你在外键对象上设置了属性。这应该有希望解决它,不幸的是我现在无法自己测试它。

models.User.hasMany(models.AudioConfig, {
  as: 'createdByUser',
  foreignKey: {
    name: 'createdBy',
    allowNull: false
  }
});
models.User.hasMany(models.AudioConfig, {
  as: 'updatedByUser',
  foreignKey: {
    name: 'updatedBy'
  }
});
models.AudioConfig.belongsTo(models.User, {
  as: 'createdByUser',
  foreignKey: {
    name: 'createdBy',
    allowNull: false
  }
});
models.AudioConfig.belongsTo(models.User, {
  as: 'updatedByUser'
  foreignKey: {
    name: 'updatedBy'
  }
});