Как добиться ЗАМЕНЫ INTO в доктрине2 - PullRequest
0 голосов
/ 05 июня 2019

Я занимаюсь рефакторингом кодовой базы, потому что это устаревший код с большим количеством необработанного sql, и все дело в спагетти-коде.

Мне грустно сказать, что в доктрине нет REPLACE INTO функциональности,Я знаю причины, по которым.

Я нашел какой-то обходной путь, например merge, но это устарело.

Я трачу много часов на изучение доктрины, потому что широко используется ORM, имного часов, пока я строил сущности.

Есть ли какое-нибудь "легальное" решение для достижения этой цели REPLACE INTO?

1 Ответ

0 голосов
/ 07 июня 2019

Вы можете обработать дубликаты, поймав UniqueConstraintViolationException.

$entity = new PossibleDuplicatedEntity();

try {
   $em->persist($entity);
   $em->flush();
}
catch (\Doctrine\DBAL\Exception\UniqueConstraintViolationException $e) {
    // handle duplicated values
}

Но будьте осторожны - Doctrine использует неявные транзакции. Когда генерируется исключение, транзакция откатывается и EntityManager закрывается (объекты отключаются). См. Документацию .

Лучше бы обработать причину дублирования. То есть если это из-за параллелизма, попробуйте использовать блокировку таблиц и т. д.

...