我正在使用 Symfony 5、Doctrine 和 PostgreSQL。
在某些事務存盤庫中,我正在嘗試運行以下代碼:
$queryBuilder = $this->em->createQueryBuilder('tr');
$queryBuilder2 = $this->em->createQueryBuilder('t');
$queryBuilder2->select('t.id', 't.status')
->where(
$queryBuilder->expr()->isNotNull('t.timeoutAt'),
$queryBuilder->expr()->lt('t.timeoutAt', ':timeoutAt'),
$queryBuilder->expr()->in('t.status', ':status')
)->setParameters([
'timeoutAt' => Carbon::now(TimezoneEnum::UTC),
'status' => ['pending', 'done'],
])->getDQL();
$queryBuilder->update()
->set(
't.status',
'CASE WHEN t.status = :statusPending THEN :statusDone ELSE :statusInProgress END'
)
->set('tr.updatedAt', ':updatedAt')
->from($queryBuilder2->getDQL(), 't')
->where('t.id = tr.id')
->setParameters([
'updatedAt' => Carbon::now(TimezoneEnum::UTC),
'statusPending' => 'pending',
'statusDone' => 'done',
'statusInProgress' => 'progress',
]);
呼叫后$queryBuilder->getQuery()->getResult();出現錯誤:
Doctrine\ORM\Query\QueryException:[語法錯誤] 第 0 行,第 37 列:錯誤:預期的 Doctrine\ORM\Query\Lexer::T_SET,得到 ','
如果洗掉->from($queryBuilder2->getDQL(), 't')錯誤將被修復,但我需要這個FROM。
也$queryBuilder2->getQuery()->getResult()作業完美;
如何正確地將 $querybuilder2 的 sql 放入 FROM 部分?
uj5u.com熱心網友回復:
這應該是你想要的
它將更新狀態和updatedAt,僅適用于“待處理”和“完成”交易
getSingleScalarResult() 會讓你知道有多少交易被更新,
根據需要更改它
return $this->getEntityManager()
->createQueryBuilder()
->update(Transaction::class, 't')
->set('t.status', 'CASE WHEN t.status = :statusPending THEN :statusDone ELSE :statusInProgress END')
->set('t.updatedAt', ':updatedAt')
->where('t.status IN (:statuses)')
->andWhere('t.timeoutAt is NOT NULL')
->andWhere('t.timeoutAt < :timeoutAt')
->setParameter('statuses', ['pending', 'done'])
->setParameter('updatedAt', Carbon::now(TimezoneEnum::UTC))
->setParameter('statusPending','pending')
->setParameter('statusDone', 'done')
->setParameter('statusInProgress', 'progress')
->setParameter('timeoutAt', Carbon::now(TimezoneEnum::UTC))
->getQuery()
->getSingleScalarResult();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331687.html
標籤:PostgreSQL symfony 教义
