Nestjs pgsql typeorm:根据不同的标准更新许多记录

问题描述 投票:0回答:1

我有一个具有这些字段的实体

@Column({ name: "total_amount_paid", type: "decimal", precision: 10, scale: 2, nullable: true })
totalAmountPaid: number;

@Column({ name: "last_paid_date", type: "date", nullable: true })
lastPaidDate: Date;

我正在使用事务基础查询,因此使用这样的查询管理器

async _updateAgreementsForPayment(
    queryRunnerManager: EntityManager, agreements: AgreementDto[], paidDate: Date
  ): Promise<UpdateResult> {
    const agreementIds = agreements.map((agreement) => agreement.id);
    // Save the updated entities
    return queryRunnerManager.update(
      AgreementEntity, // Target entity
      agreementIds, // Conditions
      { lastPaidDate: paidDate } // Values to be updated
    );
  }

现在与

lastPaidDate
一起我想更新
totalAmountPaid
,应该像这样计算

totalAmountPaid = totalAmountPaid + agreementDto.paidAmount

是否可以通过更新很多或其他东西?

node.js postgresql nestjs typeorm nestjs-typeorm
1个回答
0
投票

如果

agreementDto.paidAmount
对于您可以使用的所有记录都相同:

  queryRunnerManager.update(
    AgreementEntity,
    agreementIds,
    {
      lastPaidDate,
      totalAmountPaid: () => `totalAmountPaid + ${paidAmount}`
    }
  );

如果

paidAmount
可能因记录而异,您可以使用
CASE
:

  queryRunnerManager.update(
    AgreementEntity,
    agreementIds,
    {
      lastPaidDate,
      totalAmountPaid: () => {
        return `
          amount + CASE
            ${agreements.map((agreementDto) => `WHEN id = ${agreementDto.id} THEN amount + ${agreementDto.paidAmount}`).join(' ')}
            ELSE amount
          END
        `
      }
    }
  );

但要小心,因为在这种形式下你应该进行一些检查以防止 SQL 注入。

© www.soinside.com 2019 - 2024. All rights reserved.