Sequelize包含嵌套对象数组 – node.js

我有关系:

(Track) – M:1 – >(TrackChannel)< – 1:M(Channel)
(User) – M:1 – >(UserChannel)< – 1:M(Channel)

  • Channel模型包含对象Track作为current_track_id与关系一对一。
  • TrackChannel通过TrackChannel相关TrackChannel
  • UserChannel通过UserChannel相关UserChannel

/ * Channel.js:* /

 module.exports = function(sequelize, DataTypes) { return sequelize.define('channel', { id: { allowNull: false, primaryKey: true, type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, }, current_counter: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, track_counter: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, track_id: { type: DataTypes.STRING, allowNull: true, references: { model: 'track', key: 'id' } }, createdAt: { type: DataTypes.TIME, allowNull: true, defaultValue: sequelize.fn('now') }, updatedAt: { type: DataTypes.TIME, allowNull: true, defaultValue: sequelize.fn('now') } }, { tableName: 'channel', classMethods:{ associate:function(models){ this.belongsToMany(models.user, { onDelete: "CASCADE", foreignKey: 'user_id', otherKey: 'channel_id', through: 'userChannel' }) this.belongsToMany(models.track, { onDelete: "CASCADE", foreignKey: 'track_id', otherKey: 'channel_id', through: 'trackChannel' }) this.belongsTo(models.track, {foreignKey: 'current_track_id' , foreignKeyConstraint: true}) } } }); }; 

你在做什么?

那是我对这个频道的查询。 我使用存储库模式:

 return db.channel.findOne({ raw:true, include: [ { model: db.track, attributes: ['id', 'name','artist_name' ,'album_name'], where: {track_id, }, paranoid: true, required: false} ], where: { id: id } }); 

你期望发生什么?

我想得到:

 { "id": "ce183d0a-e702-49a3-83b5-2912bbcf5283", "current_counter": 0, "track_counter": 0, "current_track_id": {} // object or null, "createdAt": "21:26:56.487217", "updatedAt": "21:26:56.487217", "tracks: [] // array or null } 

究竟发生了什么?

我尝试创build查询来获取一个通道,其中包含当前轨道对象和轨道列表。 现在看起来像这样:

 { "id": "ce183d0a-e702-49a3-83b5-2912bbcf5283", "current_counter": 0, "track_counter": 0, "track_id": null, "createdAt": "21:26:56.487217", "updatedAt": "21:26:56.487217", "tracks.id": null, "tracks.name": null, "tracks.artist_name": null, "tracks.album_name": null, "tracks.trackChannel.id": null, "tracks.trackChannel.channel_id": null, "tracks.trackChannel.createdAt": null, "tracks.trackChannel.updatedAt": null, "tracks.trackChannel.track_id": null } 

方言:postgres数据库版本:9.6 Sequelize版本:3.3.0

解:

 findById: function(id) { return db.channel.findOne({ logging: true, include: [ { model: db.track, attributes: ['id', 'name','artist_name' ,'album_name'], as: 'track'}, { model: db.track, attributes: ['id', 'name','artist_name' ,'album_name'], as: 'tracks', paranoid: true, required: false} ], where: { id: id } }); },