У меня есть приложение, которое использует Node , Postgres и Sequelize . В настоящее время у меня есть 3 модели в моей БД. User
, Customer
и Ticket
.
Билет имеет отношение: n к клиенту и пользователю.
Когда я создаю новый тикет, я я должен передать массив из двух пользователей, каждый из которых имеет свой тип в отношении Ticket-User, сохраненный в сводной таблице.
Проблема возникает, когда я пытаюсь установить обоих пользователей как одного пользователя, что означает, что в этом билете один пользователь играл роль двух. Поэтому, когда я пытаюсь получить эту информацию, Sequelize возвращает этого пользователя только один раз с одной из сыгранных ролей, тогда как на самом деле я хотел, чтобы этот пользователь был возвращен 2 раза, каждый раз с его ролью.
Вот как я сделал запрос на создание нового тикета ( Обратите внимание, что в поле users
есть пользователь с идентификатором 1, играющий роль ОФИС и ИНСПЕКЦИЯ ):
![enter image description here](https://i.stack.imgur.com/CZQI3.png)
Вот как это создается с помощью Sequelize:
const {
interested,
opening_date,
office_status,
inspection_status,
subject,
external_code,
conclusion_method,
obs,
users,
customer_id,
is_owner
} = req.body;
try {
const ticket = await Ticket.create({
interested,
opening_date,
office_status,
inspection_status,
subject,
external_code,
conclusion_method,
obs
});
if (users && users.length > 0) {
users.forEach(({ id, type }) => {
ticket.addUser(id, { through: { type } });
});
}
if (customer_id && is_owner) {
ticket.addCustomer(customer_id, { through: { is_owner } });
}
if (ticket) {
res.status(200).json({ MSG: "SAVE_SUCCESS" });
} else {
throw new Error({ err: "Ticket was not created" });
}
} catch (error) {
if (error.errors && error.errors.length >= 1) {
let errResponse = {};
error.errors.map(err => {
errResponse = { ...errResponse, [err.path]: err.message };
});
res.status(200).json({ err: errResponse });
return;
}
res.status(500).json(error);
}
}
И это работает нормально, если я вручную проверю таблицу в БД, то это показывает пользователя с ID 1 в списке дважды, один раз с каждой ролью.
![enter image description here](https://i.stack.imgur.com/hhKnO.png)
Проблема возникает, когда я пытаюсь ее запросить, вот как я это делаю:
const tickets = await Ticket.findAll({
include: [
{
model: User,
attributes: ["id", "fname", "lname", "username", "email"],
through: { model: TicketsUsers, attributes: ["type"] }
},
{
model: Customer,
attributes: ["id", "name", "document"],
through: { model: TicketsCustomer, attributes: ["is_owner"] }
}
]
});
if (tickets) {
res.status(200).json(tickets);
} else {
throw new Error({ err: "EMPTY" });
}
} catch (err) {
res.status(500).json(err);
}
Работает, когда разные пользователи назначаются для каждой роли, однако, когда одному и тому же пользователю назначается обе роли, возвращается следующее:
![enter image description here](https://i.stack.imgur.com/Q6Pjc.png)
Как видите, поле users
только один раз перечисляет пользователя с идентификатором 1, используя роль OFFICE
, когда он должен был указать пользователя с идентификатором 1 два раза по одному с каждой ролью, которую он сыграл в этом билете.
Как я уже говорил, это происходит только тогда, когда я назначаю одного и того же пользователя для обеих ролей, если они разные пользователи используются для каждой роли, затем запрос возвращает обоих пользователей в поле users
, как и ожидалось, что заставило меня поверить, что код верен, я даже включил ведение журнала Sequelize и вручную выполнил возвращаемый запрос, и достаточно пользователи, которые вернулись по этому запросу. Так что он делает что-то внутренне, что заставляет пользователя с таким же идентификатором появляться только один раз.
Я нашел похожую проблему здесь: https://github.com/sequelize/sequelize/issues/7541
Однако проблема там был пропущенный идентификатор на одном из его столов, что не в моем случае. Все мои таблицы имеют уникальные идентификаторы.
Значит, кто-нибудь знает, почему это происходит и как это решить?
Спасибо.