续集一对一的关系

Posted

技术标签:

【中文标题】续集一对一的关系【英文标题】:Sequelize one to one relation 【发布时间】:2017-09-30 12:02:35 【问题描述】:

我有两个模型,视频和帧。

Frame.belongsTo(models.Video);
Video.hasMany(models.Frame,  as: "Frames" );

我现在需要一种方法来指定视频的第一帧和最后一帧,但无法正常工作。

我试过了:

Video.hasOne(Frame,  as: "FirstFrame" );
Video.hasOne(Frame,  as: "LastFrame" );

但这会在 Frames 表而不是 Videos 表中创建 FirstFrameId 和 LastFrameId。我需要有 video.get/setFirstFrame() 和 video.get/setLastFrame() 函数可用。我该怎么做?

【问题讨论】:

【参考方案1】:

您不需要像一开始那样设置belongTo 和hasMany。根据您的数据库架构仅使用一个。

要获取视频模型上的 FirstFrameId 和 LastFrameId,您需要使用:

Video.belongsTo(Frame, as: 'FirstFrame');
Video.belongsTo(Frame, as: 'LastFrame');

这是在 Sequelize 文档中指定的,您可以查看它here

“尽管它被称为 HasOne 关联,但对于大多数 1:1 关系 您通常需要 BelongsTo 关联,因为 BelongsTo 会添加 hasOne 将添加到目标的源上的 foreignKey。"

【讨论】:

以上是关于续集一对一的关系的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize.js 插入具有一对多关系的模型

无法创建具有一对多关系的对象

Laravel 一对多关系和一对一关系

ThinkPHP5中模型的一对一关联关系

mybatis一对一关联关系映射

Hibernate多表关系配置——一对一关系映射