Микро-орм: обновление с помощью оператора select

Я пытаюсь обновить столбец таблицы, который зависит еще от одной таблицы. Запрос sql работает нормально в базе данных и не смог определить запрос микро-ормы для этого. Ниже приведены запросы sql и mikro-orm, которые я пробовал. Микро-орм не принимает запросы на обновление как необработанные запросы. Может ли кто-нибудь мне помочь или хотя бы помочь мне в этом?

UPDATE schema.control_subs AS s
SET cancel_date = CASE 
        WHEN :input_date < c.start_date THEN c.start_date
        ELSE :input_date
    END
FROM schema.controls AS c
WHERE s.control_id = c._id
AND s.control_id IN (:controlIds);
await this.em
  .createQueryBuilder(ControlSubs)
  .update({
    cancel_date: this.em
      .createQueryBuilder(Controls, "c")
      .select(
        // raw(`CASE WHEN ${cancelDate} < c.start_date THEN c.start_date ELSE ${cancelDate} END`)
        raw(
            `CASE WHEN 
                TIMESTAMP ${cancelDate
                    .toISOString()} AT TIME ZONE 'UTC' < c.start_date 
                THEN c.start_date 
                ELSE TIMESTAMP ${cancelDate.toISOString()} AT TIME ZONE 'UTC' END`,
        ),
      )
      .where("c._id = s.control_id"),
  })
  .where({
    s.control_id: { $in: controlIds },
  });

Я пробовал это Как добавить выражение CASE в построитель запросов mikro-orm? но выражение сейчас недоступно.

🤔 А знаете ли вы, что...
Node.js - это среда выполнения JavaScript, разработанная на основе JavaScript V8 движка, созданного Google.


57
1

Ответ:

Решено

Я изменил запрос таким образом, чтобы часть обновления брала даты в зависимости от условий и объединяла таблицы с помощью .join(). Вот обновленный запрос.

await this.em
  .createQueryBuilder(ControlSubs, 'cs')
  .update({
    cancel_date: raw(
      `
      CASE 
        WHEN ? < ( SELECT start_date FROM schema.controls WHERE _id = cs.control_id)
        THEN (SELECT start_date FROM schema.controls WHERE _id = cs.control_id)
        ELSE ?
      END
      `,
      [cancelDate, cancelDate],
    ),
  }).join('cs.control_id', 'c')
  .where({
    s.control_id: { $in: controlIds },
  });

Было бы здорово, если бы кто-нибудь рассмотрел его и дал какие-либо предложения по его улучшению.