首页 > 解决方案 > Model.findAll() 只返回一个相同的孩子

问题描述

我有一个使用NodePostgresSequelize的应用程序。目前我的数据库中有 3 个模型。User,CustomerTicket.

票证与客户和用户具有: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。

所以有人知道为什么会发生这种情况以及如何解决它?

谢谢你。

标签: node.jspostgresqlsequelize.js

解决方案


推荐阅读