【发布时间】:2017-06-22 02:41:13
【问题描述】:
我有关系:
(Track) -- M:1 --> (TrackChannel) (用户) -- M:1 --> (用户频道)
-
Channel模型包含对象Track为current_track_id并具有一对一的关系。 -
Track和Channel通过TrackChannel多对多相关联 -
User和Channel通过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
}
实际发生了什么?
我尝试创建查询以获取一个频道,其中包含当前曲目对象和曲目列表。现在看起来像这样:
{
"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 续集版本:3.3.0
【问题讨论】:
-
github.com/sequelize/sequelize/issues/4973 - 这是将
track作为数组的解决方案。但是如何获取相关曲目 -
如果你完全卡在
sequelize,有pg-promise,它完美支持存储库模式,如pg-promise-demo所示,可以与你的sequelize代码愉快地共存;) -
谢谢我去看看。但它确实帮助我清理我的代码:)
-
你需要设置
nest: truegithub.com/sequelize/sequelize/issues/…
标签: node.js postgresql sequelize.js