Model.findAll () возвращает только одного и того же потомка - PullRequest
1 голос
/ 31 марта 2020

У меня есть приложение, которое использует Node , Postgres и Sequelize . В настоящее время у меня есть 3 модели в моей БД. User, Customer и Ticket.

Билет имеет отношение: n к клиенту и пользователю.

Когда я создаю новый тикет, я я должен передать массив из двух пользователей, каждый из которых имеет свой тип в отношении Ticket-User, сохраненный в сводной таблице.

Проблема возникает, когда я пытаюсь установить обоих пользователей как одного пользователя, что означает, что в этом билете один пользователь играл роль двух. Поэтому, когда я пытаюсь получить эту информацию, Sequelize возвращает этого пользователя только один раз с одной из сыгранных ролей, тогда как на самом деле я хотел, чтобы этот пользователь был возвращен 2 раза, каждый раз с его ролью.

Вот как я сделал запрос на создание нового тикета ( Обратите внимание, что в поле users есть пользователь с идентификатором 1, играющий роль ОФИС и ИНСПЕКЦИЯ ):

enter image description here

Вот как это создается с помощью 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

Проблема возникает, когда я пытаюсь ее запросить, вот как я это делаю:

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

Как видите, поле users только один раз перечисляет пользователя с идентификатором 1, используя роль OFFICE, когда он должен был указать пользователя с идентификатором 1 два раза по одному с каждой ролью, которую он сыграл в этом билете.

Как я уже говорил, это происходит только тогда, когда я назначаю одного и того же пользователя для обеих ролей, если они разные пользователи используются для каждой роли, затем запрос возвращает обоих пользователей в поле users, как и ожидалось, что заставило меня поверить, что код верен, я даже включил ведение журнала Sequelize и вручную выполнил возвращаемый запрос, и достаточно пользователи, которые вернулись по этому запросу. Так что он делает что-то внутренне, что заставляет пользователя с таким же идентификатором появляться только один раз.

Я нашел похожую проблему здесь: https://github.com/sequelize/sequelize/issues/7541

Однако проблема там был пропущенный идентификатор на одном из его столов, что не в моем случае. Все мои таблицы имеют уникальные идентификаторы.

Значит, кто-нибудь знает, почему это происходит и как это решить?

Спасибо.

...