如何在 Sequelize 中创建关联
How to create with association in Sequelize
我有两个与 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'
})
模型_user_sources:
const UserSources = sequelize.define('user_sources', {
abcNews: {
type: Sequelize.BOOLEAN,
},
bbcNews: {
type: Sequelize.BOOLEAN,
}
}, {
tableName: 'user_sources'
})
UserSources.belongsTo(User)
两个模型都已初始化,table已在数据库中正确创建。 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 项未在 table 中创建。
遗憾的是,文档仅显示了从子模型创建父模型的示例,而不是相反的方式。我尝试了几种不同的方法,例如使用 hasOne 关联,在 include 中添加 model/association 选项,将数据放入 create 方法等。但我觉得好像我没有正确掌握这个概念。
如果有人能阐明我的问题,我将不胜感激。谢谢
"sequelize": "^5.21.3"
。以下是为具有关联的 User
和 UserSources
模型创建数据记录的三种方法。此外,我们不断添加使用 userId
的外键约束到 user_sources
table.
例如
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)
数据记录按预期创建。
我有两个与 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'
})
模型_user_sources:
const UserSources = sequelize.define('user_sources', {
abcNews: {
type: Sequelize.BOOLEAN,
},
bbcNews: {
type: Sequelize.BOOLEAN,
}
}, {
tableName: 'user_sources'
})
UserSources.belongsTo(User)
两个模型都已初始化,table已在数据库中正确创建。 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 项未在 table 中创建。
遗憾的是,文档仅显示了从子模型创建父模型的示例,而不是相反的方式。我尝试了几种不同的方法,例如使用 hasOne 关联,在 include 中添加 model/association 选项,将数据放入 create 方法等。但我觉得好像我没有正确掌握这个概念。
如果有人能阐明我的问题,我将不胜感激。谢谢
"sequelize": "^5.21.3"
。以下是为具有关联的 User
和 UserSources
模型创建数据记录的三种方法。此外,我们不断添加使用 userId
的外键约束到 user_sources
table.
例如
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)
数据记录按预期创建。