У меня три таблицы: видеоклипы, плейлисты и видеороликиPlaylistMap.
Я хочу вернуть JSON, содержащий все плейлисты, и для каждого плейлиста - массив содержащихся видеороликов.
Я не могу понять, как сделать сиквел-ассоциации для достижения этого.
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.com/manual/tutorial/associations.html#target-keys