Доктрина Symfony 2 +: Как подавить SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись - PullRequest
4 голосов
/ 09 февраля 2012

Я просмотрел пару постов, но не смог найти работающего решения.

Мой вопрос не прост:

У меня есть сущность с id, url и title. URL должен быть уникальным (в MySQL PDO). Мне удалось создать сущность и схему без проблем. Теперь, когда я хожу по нескольким записям, я называю persist() на каждой и, наконец, flush(). Проблема в том, что, когда я пытаюсь вставить повторяющиеся записи для URL, это дает мне исключение. Как подавить это?

Когда вставляется повторяющаяся запись, ее следует просто пропустить и вставить остальные. Нет необходимости в событиях, инструкциях ON UPDATE, триггерах и прочем.

Я пытался отловить все исключения, выданные persist или flush(), но, похоже, не могу сделать это правильно.

Любые идеи приветствуются, спасибо!

РЕДАКТИРОВАТЬ: нашел мое решение здесь: Контроллер Symfony2 не будет ловить исключение

Ответы [ 3 ]

12 голосов
/ 21 октября 2012

В Symfony 2.1+ ловите его, используя \Doctrine\DBAL\DBALException вместо \PDOException.

try {
    ...
} catch (\Doctrine\DBAL\DBALException $e) {
    // ... Error on database call
}
6 голосов
/ 15 февраля 2013

Имейте в виду, что в Symfony 2.1 возникает исключение PDOException, если вы, например, удаление записи с родительскими отношениями. Но чтобы поймать это, вы будете использовать утверждение, предложенное ihsan

    try {
        $em = $this->getDoctrine()->getEntityManager();
        $em->remove($entity);
        $em->flush();
    } catch(\Doctrine\DBAL\DBALException $e)
    {
        // ...
    }
2 голосов
/ 09 февраля 2012
try {
    $em->flush()
} catch (\PDOException $e) {
    // ... Error on database call
}

Лучшим подходом было бы указать ограничение проверки, чтобы избежать необходимости иметь дело с этим исключением. В ямле (взято из symfony docs )

Acme\SomeBundle\Entity\Item:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...