如何在 Sequelize 中创建关联
Posted
技术标签:
【中文标题】如何在 Sequelize 中创建关联【英文标题】:How to create with association in Sequelize 【发布时间】:2020-02-20 23:56:20 【问题描述】:我有两个与 belongsTo 关系相关联的 Sequelize 模型。我想在创建用户时创建一个 user_sources 实例,但我正在努力完成它。
model_user:
const User = sequelize.define('user',
email:
type: Sequelize.STRING,
allowNull: false,
unique: true,
,
password:
type: Sequelize.STRING,
allowNull: false
,
tableName: 'users'
)
model_user_sources:
const UserSources = sequelize.define('user_sources',
abcNews:
type: Sequelize.BOOLEAN,
,
bbcNews:
type: Sequelize.BOOLEAN,
,
tableName: 'user_sources'
)
UserSources.belongsTo(User)
两个模型都已初始化,并且在数据库中正确创建了表。 According to the Sequelize documentation I should be able to create both with association in a single query 像这样:
User
.create(
email: user.email,
password: user.password,
,
include: UserSources
)
但是,仅创建用户。 user_sources 项目不会在表中创建。
不幸的是,该文档仅显示了从子模型创建父模型的示例,而不是相反的示例。我尝试了几种不同的方法,例如使用 hasOne 关联、在 include 中添加模型/关联选项、将数据放入 create 方法等。但我感觉好像我没有正确掌握这个概念。
如果有人能阐明我的问题,将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:"sequelize": "^5.21.3"
。以下是为具有关联的User
和UserSources
模型创建数据记录的三种方法。此外,我们不断将使用userId
的外键约束添加到user_sources
表中。
例如
index.js
:
import sequelize from '../../db';
import Sequelize from 'sequelize';
const User = sequelize.define(
'user',
email:
type: Sequelize.STRING,
allowNull: false,
unique: true,
,
password:
type: Sequelize.STRING,
allowNull: false,
,
,
tableName: 'users',
,
);
const UserSources = sequelize.define(
'user_source',
abcNews:
type: Sequelize.BOOLEAN,
,
bbcNews:
type: Sequelize.BOOLEAN,
,
,
tableName: 'user_sources',
,
);
UserSources.belongsTo(User);
// User.UserSources = User.hasOne(UserSources);
// User.hasOne(UserSources);
(async function test()
try
await sequelize.sync( force: true );
// 1. User.UserSources = User.hasOne(UserSources);
// await User.create(
//
// email: 'example@gmail.com',
// password: '123',
// user_source:
// abcNews: true,
// bbcNews: true,
// ,
// ,
//
// include: [
//
// association: User.UserSources,
// ,
// ],
// ,
// );
// 2. User.hasOne(UserSources);
// await User.create(
//
// email: 'example@gmail.com',
// password: '123',
// user_source:
// abcNews: true,
// bbcNews: true,
// ,
// ,
//
// include: [UserSources],
// ,
// );
// 3. UserSources.belongsTo(User);
await UserSources.create(
abcNews: true,
bbcNews: true,
user:
email: 'example@gmail.com',
password: '123',
,
,
include: [User],
,
);
catch (error)
console.log(error);
finally
await sequelize.close();
)();
执行上述代码后,查看数据库中的数据记录:
node-sequelize-examples=# select * from "users";
id | email | password
----+-------------------+----------
1 | example@gmail.com | 123
(1 row)
node-sequelize-examples=# select * from "user_sources";
id | abcNews | bbcNews | userId
----+---------+---------+--------
1 | t | t | 1
(1 row)
数据记录按预期创建。
【讨论】:
谢谢,我现在更了解机制了以上是关于如何在 Sequelize 中创建关联的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SEQUELIZE (nodeJS) 中创建触发器?
如何在 Sequelize 中创建一个表以使用 Node JS 存储在 Postgresql 中
如何在 Sequelize 中类型为 TIME 的列中创建位置?
如何在 Sequelize 中的导入模型中创建自定义方法或函数