Как вставить данные в несколько таблиц в одном запросе БД с помощью sequelize? - PullRequest
1 голос
/ 05 мая 2020

У меня следующее соотношение:

enter image description here

Ассоциация:

  users.belongsToMany("roles", {
    through: "userRoles",
  });

При создании пользователя я делаю следующее:

register: async (obj, args, context, info) => {
  const PasswordHash = await bcrypt.hash(args.input.Password, 12);

  const user = db.users.create({
    ...args.input,
    Password: PasswordHash,
  });

  db.userroles.create({
    UserId: user.Id,
    RoleId: args.input.roleId,
  });
},

Как это сделать в одном запросе? Прямо сейчас я делаю это при создании пользователя, а затем получаю идентификатор вновь созданного пользователя и добавляю роль этому пользователю (запрос 2). 1014

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Создайте сохраненный pro c в своей MySQL DB для создания обеих записей, например,

drop procedure if exists createUser
DELIMITER //
CREATE PROCEDURE createUser
(
    IN email VARCHAR(200),
    IN password BINARY(60),
    IN roleId INT
)
BEGIN
    DECLARE userId BINARY(16);

    INSERT INTO Users (Email, Password)
    VALUES (email, password);   

    # Assuming your user ID is auto-generated, pull ID of last insert
    SET userId = LAST_INSERT_ID()

    INSERT INTO UserRoles (UserId, RoleId)
    VALUES (userId, roleId);

END //

DELIMITER ;

Затем вы можете вызвать это сохраненное pro c с помощью Sequelize

const { email, roleId } = args.input;
const result = await sequelize
  .query('CALL createUser (:email, :password, :roleId)', 
        {replacements: { email, password: PasswordHash, roleId }});

Вы можете настроить соответствующие параметры, но идею вы поняли.

0 голосов
/ 06 мая 2020

Невозможно создать пользователя и добавить роли одновременно, если вы не хотите создать настраиваемую хранимую процедуру в MySQL.

Попробуем упростить вашу задачу. Вы не знаете ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ до создания пользователя. Поэтому невозможно создать роль до создания пользователя. Одним из способов решения этой проблемы является создание идентификатора пользователя в вашем коде.

Вы можете добавить дополнительный столбец в свою таблицу «Пользователи» с именем GeneratedId и преобразовать столбец идентификатора в AUTO_INCREMENT, а затем использовать такой пакет как https://www.npmjs.com/package/uuid, чтобы сгенерировать уникальный идентификатор перед добавлением пользователя.

Используйте тот же сгенерированный идентификатор, чтобы связать роль с пользователем (столбец «UserId» в таблице «UserRole» будет содержать идентификатор, созданный вами в коде).

Теперь вы можете добавить пользователь и все связанные с ним данные, не дожидаясь ответа от сервера.

...