Я использую эту стратегию для проверки уникальных ограничений после flush () , может быть не тем, что вы хотите, но может помочь кому-то еще.
Когда вы звоните flush () , в случае сбоя уникального ограничения, PDOException генерируется с кодом 23000 .
try {
// ...
$em->flush();
}
catch( \PDOException $e )
{
if( $e->getCode() === '23000' )
{
echo $e->getMessage();
// Will output an SQLSTATE[23000] message, similar to:
// Integrity constraint violation: 1062 Duplicate entry 'x'
// ... for key 'UNIQ_BB4A8E30E7927C74'
}
else throw $e;
}
Если вам нужно получить имя ошибочного столбца :
Создайте индексы таблиц с префиксными именами, например.'unique _'
* @Entity
* @Table(name="table_name",
* uniqueConstraints={
* @UniqueConstraint(name="unique_name",columns={"name"}),
* @UniqueConstraint(name="unique_email",columns={"email"})
* })
НЕ указывайте ваши столбцы как уникальные в определении @Column
Кажется, что имя индекса переопределяется случайным...
**ie.** Do not have 'unique=true' in your @Column definition
После того, как вы регенерируете свою таблицу (вам может потребоваться удалить ее и перестроить), вы сможете извлечь имя столбца из сообщения об исключении.
// ...
if( $e->getCode() === '23000' )
{
if( \preg_match( "%key 'unique_(?P<key>.+)'%", $e->getMessage(), $match ) )
{
echo 'Unique constraint failed for key "' . $match[ 'key' ] . '"';
}
else throw $e;
}
else throw $e;
Не идеально, но работает ...