вставить игнорировать на повторяющиеся записи в Doctrine2 / Symfony2 - PullRequest
16 голосов
/ 14 марта 2012

Как игнорировать дубликаты записей с помощью Doctrine2?

Пример ошибки:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'symfony' for key 'UNIQ_389B783389B783'

Ответы [ 3 ]

15 голосов
/ 14 июля 2017

В Symfony 3 вы можете сбросить менеджер и продолжить работу с ним, вызвав resetManager() метод объекта Doctrine после перехвата UniqueConstraintViolationException исключения.

Вот пример:

try {
  $em = $this->getDoctrine()->getManager();
  $entity = Product::create()
    ->setTitle('Some title')
    ->setUrl('http://google.com');
  $em->persist($entity);
  $em->flush();
}
catch (UniqueConstraintViolationException $e) {
  $this->getDoctrine()->resetManager();
}
13 голосов
/ 06 мая 2014

Это одна из неприятностей Doctrine, невозможно сделать INSERT / UPDATE Ignore, есть обходной путь, например создание методов, которые проверяют, существует ли строка, и если она существует, то просто пропускаем ее.

Вы можете перехватить исключение, чтобы ваш сценарий не заканчивался исключением.Однако менеджер сущностей будет закрыт, и вы больше не сможете его использовать.Тем не менее, вы все еще можете использовать PDO, и вы можете вставить запись в базу данных, указывающую, что ваш пакет не прошел, потому что X, и его нужно перезапустить (это то, что я обычно делаю).

Если ни один из вариантоввыше работы для вас, в конечном итоге я в конечном итоге пишу сырой SQL для пакетной обработки, и я вообще не использую Doctrine, в конечном итоге он работает быстрее, а способность выполнять INSERT / UPDATE Ignore делает его легким делом.

11 голосов
/ 14 марта 2012

Вы всегда можете поймать исключение, а затем проигнорировать его. Просто имейте в виду, что, когда менеджер сущностей вызывает исключение, менеджер сущностей больше не может использоваться во время этого запроса.

...