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

Fil*_*ero 5 sequelize.js

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

我有两个型号 - UserAudioConfig.一个User可以有很多AudioConfigAudioConfig属于一个UsercreatedByupdatedBy.

以下是我的协会使用Sequelize的方式

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'
  }
});
Run Code Online (Sandbox Code Playgroud)

在我的findAll查询中AudioConfig,我尝试了几种与我在网上找到的不同,但似乎没有像我期望的那样工作:

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);
    })
};
Run Code Online (Sandbox Code Playgroud)

现在,在我的数据库中,我有一个记录,AudioConfig它有两个不同的User引用 - 一个用于createdBy,另一个用于updatedBy.但是当我查询时AudioConfig,我只能获得UserupdatedBy字段的记录.

[
  {
    "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"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

如何获取它以便createdByUUID的值被替换为User与之关联的对象?对于这个updatedBy领域一样吗?

我有点期待与MongoDB和Mongoose相同的行为populate

gri*_*urd 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'
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 而不是在 `findAll` 中使用 `include: {all:true}` 你可以使用 `include: {model: models.User, as: 'createdByUser'}` 等。确保在所有关联中使用 `as:`到 Sequelize 模型声明中的相同模型。 (2认同)