создание нового экземпляра / записи модели со связанными внешними ключами - PullRequest
0 голосов
/ 22 января 2020

Я новичок в Sequelize и у меня проблемы с синтаксисом. Я сделал следующие модели:

// User
sequelize.define('user', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

// Type
sequelize.define('type', {
  typeName: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

Я создал связь между ними:

User.Type = User.belongsTo(Type, { foreignKey: { allowNull: false } })

И подтвердил, что полученная таблица User имеет ссылку внешнего ключа на typeId.

Когда я хочу создать нового пользователя, я также хочу передать строку 'fan' или 'band', которая будет ссылкой на один из двух типов, которые заполняют таблицу типов. Как мне сообщить об этом в моей функции create?

const createUser = (req, res) => {
    const { name, type } = req.body;
    User.create({
        name,
        include: [{
            association: User.Type
        }]
    })
    .then(() => console.log('success'))
    .catch((err) => console.log(err));
}

1 Ответ

0 голосов
/ 22 января 2020

Вы можете создать пользователя и ввести ассоциации. Ниже приведен пример использования "sequelize": "^5.21.3"

Например

index.js:

import { DataTypes } from 'sequelize';
import { sequelize } from '../../db';

export const User = sequelize.define('user', {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

export const Type = sequelize.define('type', {
  typeName: {
    type: DataTypes.STRING,
    allowNull: false,
  },
});

User.Type = User.belongsTo(Type, { foreignKey: { allowNull: false } });

export const createUser = (req, res) => {
  const { name, type } = req.body;
  return User.create(
    {
      name,
      type: { typeName: type },
    },
    { include: [{ association: User.Type }] },
  )
    .then(() => console.log('success'))
    .catch((err) => console.log(err));
};

index.test.js:

import { createUser, Type, User } from './';
import { sequelize } from '../../db';

describe('59849396', () => {
  beforeAll(async () => {
    await sequelize.sync({ force: true });
  });
  afterAll(async () => {
    await sequelize.close();
  });
  it('should create user with type correctly', async () => {
    const mReq = { body: { name: 'Tom', type: 'band' } };
    const mRes = {};
    await createUser(mReq, mRes);
    const type = await Type.findOne({ where: { typeName: 'band' } });
    const user = await User.findOne({ where: { name: 'Tom' } });
    expect(type.typeName).toBe(mReq.body.type);
    expect(user.typeId).toBe(type.id);
  });
});

Результаты теста:

 PASS  src/examples/stackoverflow/59849396/index.test.js
  59849396
    ✓ should create user with type correctly (74ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.253s, estimated 4s

После запуска теста проверьте базу данных.

node-sequelize-examples=# select * from users;
 id | name |         createdAt          |         updatedAt          | typeId 
----+------+----------------------------+----------------------------+--------
  1 | Tom  | 2020-01-22 07:12:05.447+00 | 2020-01-22 07:12:05.447+00 |      1
(1 row)

node-sequelize-examples=# select * from types;
 id | typeName |         createdAt         |         updatedAt         
----+----------+---------------------------+---------------------------
  1 | band     | 2020-01-22 07:12:05.45+00 | 2020-01-22 07:12:05.45+00
(1 row)

Как видите, мы также создаем "полосу" type при создании пользователя "Tom". Это означает, что таблица types также заполняется строкой данных.

...