Как использовать запрос на обновление RETURNING в DQL - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь выполнить следующий простой запрос (он работает в postgresql)

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

в DQL

$query = $this->entityManager->createQuery();
            $query->setDQL("UPDATE Geoop\Core\Entity\Account 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): Doctrine\ORM\Query\Parser->syntaxError(end of string)
#31 /var/www/geoop_api/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php (line 448): Doctrine\ORM\Query\QueryException::dqlError(UPDATE Geoop\Core\Entity\Account a SET a.jobReferenceNumber__ = a.jobReferenceNumber__ + 1  WHERE a.id = :accountId  RETURNING a.id as id)

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

DQL не поддерживает предложение RETURNING, поэтому вам нужно использовать собственный SQL .Вам также придется создать отображение набора результатов .

ПРИМЕЧАНИЕ. Я не знаю фактических имен вашей таблицы и столбцов, но при условии, что они названы так же, как ваша сущность иСвойства, это будет работать:

$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$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 преобразует все имена объектов в верхний регистр, если они не заключены в кавычки.

0 голосов
/ 05 апреля 2019

спасибо за понимание :) это работает сейчас

Вот мой обновленный код: Над классом я использую ResultSetMapping

use Doctrine\ORM\Query\ResultSetMapping;

$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();
...