node.js - Model.findAll() 只返回一个相同的孩子
问题描述
我有一个使用Node、Postgres和Sequelize的应用程序。目前我的数据库中有 3 个模型。User
,Customer
和Ticket
.
票证与客户和用户具有:n 关系。
当我创建一个新票时,我应该传递一个由两个用户组成的数组,每个用户的 Ticket-User 关系中的类型都保存到数据透视表中。
当我尝试将两个用户设置为同一个用户时,就会出现问题,这意味着在该票证中,一个用户扮演了两个角色。因此,当我尝试检索此信息时,Sequelize 仅返回此用户一次并扮演其中一个角色,而实际上我希望此用户返回 2 次,每次都使用其角色。
以下是我进行查询以创建新票证的方式(请注意,该users
字段的用户 ID 为 1,扮演 OFFICE 和 INSPECTION 角色):
以下是使用 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 的用户列出两次,每个角色一次。
当我尝试查询它时会出现问题,这是我的做法:
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);
}
当不同的用户被分配给每个角色时,它可以工作,但是当同一个用户被分配给两个角色时,这就是返回的内容:
如您所见,该users
字段仅使用角色列出了 id 为 1 的用户一次,而OFFICE
当它应该列出 id 为 1 的用户两次时,它在该票证上扮演的每个角色都列出了两次。
就像我说的那样,这只发生在我为两个角色分配相同的用户时,如果每个角色使用不同的用户,那么查询会users
按预期返回字段中的两个用户,这让我相信代码是正确的,我什至转向在 Sequelize 日志记录上并手动执行它返回的查询,并且确定两个用户都在该查询上返回。所以它在内部做一些事情,使具有相同 id 的用户只出现一次。
我在这里发现了一个类似的问题:https ://github.com/sequelize/sequelize/issues/7541
然而,问题是他的一张桌子上缺少 id,这不是我的情况。我所有的表都有唯一的 ID。
所以有人知道为什么会发生这种情况以及如何解决它?
谢谢你。
解决方案
推荐阅读
- java - Payara Micro忽略persistence.xml中的连接url
- flutter - 颤振字符串修复
- java - Java中的二进制搜索不会终止
- amazon-dynamodb - 是否可以同时扫描以查找项目,然后在 DynamoDB 中的事务中更新它
- python-3.x - 无法在 Raspberry Pi 3 上安装适用于 Python 的 google-cloud-vision 客户端库
- wordpress - Wordpress:使用传入的 URL 变量参数更改页面中的文本
- github - 从 Free Heroku Dyno 推送到 Github
- python-3.x - 如何绘制嵌套列表(x)与 y
- java - 如何将 .dll 转换为 .jnilib?
- python - 我的猜谜游戏规则没有被遵守