我有一个名为Theme的实体,它的名称不是Id,但应该是索引且唯一的:
/**
* @Entity @Table(name="themes",
* uniqueConstraints={@UniqueConstraint(name="theme_unique",columns={"name"})},
* indexes={@Index(name="theme_idx", columns={"name"})})
*/
class Theme {...}
我使用现有名称创建一个新主题。这会导致错误,脚本会停止。 我该如何获取该错误并继续编写脚本?
function CreateTheme($newThemeName) {
//$theme = $this->FindByThemeName ( $newThemeName );
//if (! $theme) {
$theme = new Theme ();
$theme->setName ( $newThemeName );
$theme->setIsActive ( false );
$theme->setIsDefault ( false );
$this->entityManager->persist ( $theme );
$this->entityManager->flush ();
return $theme;
//} else {
// $this->error = "Error in flush was avoided (name not being unique)!";
// return null;
//}
答案 0 :(得分:1)
尝试/捕获设置并不能真正解决问题:
由于SQL错误,Doctrine \ ORM \ EntityManager已关闭。 EntityManager不能简单地重置(或重新打开)。关于这个主题的链接:
声明:"最好是避免获得一个封闭的实体经理(这意味着在将数据发送到数据库之前验证您的数据)"
结论:设置UniqueConstraints的注释是无用的:它不会阻止执行语法有效的SQL指令,该指令会给出"重复的条目"由于该约束导致的SQL错误。 此错误会关闭无法安全重置的EntityManager .... 您需要手动检查是否存在违反独特约束的行为'在尝试持久化并刷新新实体实例之前。
答案 1 :(得分:0)
尝试Catch没有工作,这是这个问题的原因。
ORMException的处理程序以某种方式未注册,现在就是。不清楚是什么造成的。
function CreateTheme($themeName) {
global $entityManager;
$theme = new Theme ();
$theme->setName ( $themeName );
$theme->setIsActive ( false );
$theme->setIsDefault ( false );
try {
$entityManager->persist ( $theme );
$entityManager->flush ();
} catch (Exception $e) {
echo $e->getMessage();
$theme = null;
}
return $theme;
}
当使用重复的名称时给出:
SQLSTATE [23000]:完整性约束违规:1062关键'theme_unique'重复输入'test'