如何在 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"。以下是为具有关联的UserUserSources 模型创建数据记录的三种方法。此外,我们不断将使用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 中的导入模型中创建自定义方法或函数

使用 Typescript 在 Sequelize 模型中创建实例方法

在 Sequelize 中创建对象字段