我使用Symfony3,我的费率表中有一个独特的约束。
因此,当我尝试两次运行此脚本时,第二次运行当然会出现异常。但之后我关闭了EntityManager。
如果没有手动检查表是否已经包含这样的行,我怎么能处理这个:
$rate = new Rate;
$rate->setCreatedAt($date);
$rate->setValue($rateValue);
try {
$this->getEntityManager()->persist($rate);
$this->getEntityManager()->flush();
} catch (UniqueConstraintViolationException $e) {
var_dump($this->getEntityManager()->isOpen()); // false
}
答案 0 :(得分:0)
您可以事先检查现有实体:
$existingRate = $this->getEntityManager()
->getRepository(Rate::class)
->findOneBy... // use what method suits you
if(!$existingRate) {
$rate = new Rate;
$rate->setCreatedAt($date);
$rate->setValue($rateValue);
// insert only if not found
$this->getEntityManager()->persist($rate);
} else {
// update if found
$existingRate->setValue($rateValue);
}
// you may wrap this in a try-catch to prevent other errors
$this->getEntityManager()->flush();
另一种选择是重建/重置实体管理器
if ($this->getEntityManager()->isOpen() === false) {
// reset or generate a new entity manager
}
答案 1 :(得分:0)
您可以重置实体管理器
$this->getDoctrine()->resetManager()
来自docs:
当关闭对象管理器时,此方法很有用 一个回滚事务和当你认为它有意义时 得到一个新的替换封闭的。
然而,在执行之前检查您的交易是否会失败会更好。