Polymorphic Associations - 多态关联
注意: 如本指南所述,在 Sequelize 中使用多态关联时应谨慎行事. 不要只是从此处复制粘贴代码,否则你可能会容易出错并在代码中引入错误. 请确保你了解发生了什么.
概念
一个 多态关联 由使用同一外键发生的两个(或多个)关联组成.
例如,考虑模型 Image
, Video
和 Comment
. 前两个代表用户可能发布的内容. 我们希望允许将评论放在两者中. 这样,我们立即想到建立以下关联:
-
Image
和Comment
之间的一对多关联:Image.hasMany(Comment);
Comment.belongsTo(Image); -
Video
和Comment
之间的一对多关联:Video.hasMany(Comment);
Comment.belongsTo(Video);
但是,以上操作将导致 Sequelize 在 Comment
表上创建两个外键: ImageId
和 VideoId
. 这是不理想的,因为这种结构使评论看起来可以同时附加到一个图像和一个视频上,这是不正确的. 取而代之的是,我们真正想要的是一个多态关联,其中一个 Comment
指向一个 可评论,它是表示 Image
或 Video
之一的抽象多态实体.
在继续配置此类关联之前,让我们看看如何使用它:
const image = await Image.create({ url: "https://placekitten.com/408/287" });
const comment = await image.createComment({ content: "Awesome!" });
console.log(comment.commentableId === image.id); // true
// 我们还可以检索与评论关联的可评论类型.
// 下面显示了相关的可注释实例的模型名称.
console.log(comment.commentableType); // "Image"
// 我们可以使用多态方法来检索相关的可评论内容,
// 而不必关心它是图像还是视频.
const associatedCommentable = await comment.getCommentable();
// 在此示例中,`associatedCommentable` 与 `image` 是同一件事:
const isDeepEqual = require('deep-equal');
console.log(isDeepEqual(image, commentable)); // true