繁体   English   中英

如何在 Sequelize 中创建关联

[英]How to create with association in Sequelize

我有两个与belongsTo 关系相关联的Sequelize 模型。 我想在创建用户时创建一个 user_sources 实例,但我正在努力完成它。

模型用户:

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_sources', {
    abcNews: {
        type: Sequelize.BOOLEAN,
    },
    bbcNews: {
        type: Sequelize.BOOLEAN,
    }
}, {
    tableName: 'user_sources'
})

UserSources.belongsTo(User)

两个模型都已初始化,并且在数据库中正确创建了表。 根据 Sequelize 文档,我应该能够在单个查询中创建两个关联,如下所示:

User
    .create({
        email: user.email,
        password: user.password,
    }, {
        include: UserSources
    })

但是,只会创建用户。 表中未创建 user_sources 项。

不幸的是,文档只显示了从子模型创建父模型的示例,而不是相反。 我尝试了几种不同的方法,例如使用 hasOne 关联、将模型/关联选项添加到 include、将数据放入 create 方法等。但我觉得我似乎没有正确掌握这个概念。

如果有人能对我的问题有所了解,我将不胜感激。 谢谢。

"sequelize": "^5.21.3" 以下是为具有关联的UserUserSources模型创建数据记录的三种方法。 此外,我们继续使用userIduser_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)

数据记录按预期创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM