【问题标题】:How to create with association in Sequelize如何在 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 方法等。但我感觉好像我没有正确掌握这个概念。

如果有人能阐明我的问题,将不胜感激。谢谢。

【问题讨论】:

    标签: javascript node.js orm sequelize.js associations


    【解决方案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)
    

    数据记录按预期创建。

    【讨论】:

    • 谢谢,我现在更了解机制了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多