如何将RETURNING更新查询用于DQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将RETURNING更新查询用于DQL相关的知识,希望对你有一定的参考价值。

我正在尝试运行以下简单查询(它在postgresql中工作)

update ja_clients set ref_inc_num = ref_inc_num + 1  where id = 43933 returning ref_inc_num;

int。分享

$query = $this->entityManager->createQuery();
            $query->setDQL("UPDATE GeoopCoreEntityAccount a SET a.jobReferenceNumber__ = a.jobReferenceNumber__ + 1  WHERE a.id = :accountId  RETURNING a.jobReferenceNumber__");
            $query->setParameter('accountId', $account->getId());
            $total = $query->getSingleScalarResult();

但它无法重新调整此错误:

#30 /var/www/geoop_api/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php (line 861): DoctrineORMQueryParser->syntaxError(end of string)
#31 /var/www/geoop_api/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php (line 448): DoctrineORMQueryQueryException::dqlError(UPDATE GeoopCoreEntityAccount a SET a.jobReferenceNumber__ = a.jobReferenceNumber__ + 1  WHERE a.id = :accountId  RETURNING a.id as id)
答案

DQL不支持RETURNING子句,所以你需要use native SQL。你还需要create a result set mapping

注意:我不知道您的表和列的实际名称,但假设它们的名称与您的实体和属性相同,这将起作用:

$rsm = new DoctrineORMQueryResultSetMapping();
$rsm->addScalarResult('jobReferenceNumber', 'jobReferenceNumber');

$sql = "
    UPDATE account a
    SET a.jobReferenceNumber = a.jobReferenceNumber + 1
    WHERE a.id = :accountId
    RETURNING a.jobReferenceNumber
";

$query = $this->entityManager->createNativeQuery($sql, $rsm);
$query->setParameter('accountId', $account->getId());
$total = $query->getSingleScalarResult();

您可能需要更正我的示例中的表名和列名。使用本机SQL时,必须使用数据库中的实际名称,而不是实体和属性的名称。此外,请记住postgres将所有对象名称转换为大写,除非它们被引用。

另一答案

感谢有识之士:)现在正在运作

继承我的更新代码:在类之上我使用ResultSetMapping

use DoctrineORMQueryResultSetMapping;

$rsm = new ResultSetMapping();
$rsm->addScalarResult('ref_inc_num', 'ref_inc_num');
$sql = "
UPDATE ja_clients
SET ref_inc_num = ref_inc_num + 1
WHERE id = :clientId
RETURNING ref_inc_num
";
$query = $this->entityManager->createNativeQuery($sql, $rsm);
$query->setParameter('clientId', $account->getId());
$refNum = $query->getSingleScalarResult();

以上是关于如何将RETURNING更新查询用于DQL的主要内容,如果未能解决你的问题,请参考以下文章

Java JDBC 如何使用 RETURNING 语句处理更新查询

UNION ALL vs UNION 用于更新/返回+选择?

Database | DQL&DML

多对多的 Symfony2 DQL 更新查询

如何使用 LEFT JOIN 查询将 RAW SQL 转换为 DQL

在 PHP 中,当将 PDO 与 pgSQL 一起使用时,如何在原始 INSERT sql 查询中获取“RETURNING”子句的值