最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Sequelize关联:在JSON响应中包含实体

运维笔记admin10浏览0评论

Sequelize关联:在JSON响应中包含实体

Sequelize关联:在JSON响应中包含实体

我有三个表:视频片段,播放列表和videoclipPlaylistMap。

  • Videoclips表有一个int id作为主键,videoId作为一个字符串。
  • VideoclipPlaylist map具有playlistId作为指向来自播放列表表的id的外键,以及作为外键的videoclipId,其指向来自videoclips表的videoId。

我想返回一个包含所有播放列表的JSON,并为每个播放列表返回一个包含的视频片段数组。

我无法弄清楚如何做sequelize关联,以实现这一点。

let Videoclip = sequelize.define('videoclip',{
    title: Sequelize.STRING,
    videoId: Sequelize.STRING,
    thumbnail: Sequelize.STRING,
    channelTitle: Sequelize.STRING,
    duration: Sequelize.DOUBLE,
    viewCount: Sequelize.INTEGER
});

let Playlist = sequelize.define('playlist', {
    name: Sequelize.STRING,
    userId: Sequelize.INTEGER,
    tagList: Sequelize.STRING
});

let VideoclipPlaylistMap = sequelize.define('videoclipPlaylistMap', {
    videoclipId: Sequelize.STRING,
    playlistId: Sequelize.INTEGER
});

User.hasMany(Playlist, {foreignKey: 'userId'});
Playlist.belongsTo(User, {foreignKey: 'userId'});
Playlist.hasMany(VideoclipPlaylistMap, {foreignKey: 'playlistId'});
VideoclipPlaylistMap.belongsTo(Videoclip, {foreignKey: 'videoclipId'});

因为它现在正在执行此连接:

LEFT OUTER JOIN `videoclips` AS `videoclipPlaylistMaps.videoclip` ON `videoclipPlaylistMaps`.`videoclipId` = `videoclipPlaylistMaps.videoclip`.`id`

而不是那个videoclipPlaylistMaps.videoclip.id它应该去videoclipPlaylistMaps.videoclip.videoId

回答如下:

您需要告诉Sequelize使用videoId字段作为关系的目标键。默认情况下,在belongsTo关联中,模型的主键用作目标键。您需要在关联中使用targetKey选项。

    VideoclipPlaylistMap.belongsTo(Videoclip, { foreignKey: 'videoclipId', targetKey: 'videoId' });

http://docs.sequelizejs/manual/tutorial/associations.html#target-keys

发布评论

评论列表(0)

  1. 暂无评论