我使用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
}
您可以事先检查现有实体:
$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();
另一个选择是重建/重置Entity Manager
if ($this->getEntityManager()->isOpen() === false) {
// reset or generate a new entity manager
}
您可以重置您的Entity Manager
$this->getDoctrine()->resetManager()
来自文档:
关闭对象管理器时,此方法很有用,因为 回滚交易,当您认为这是有意义的 获取一个新的代替封闭的。
但是,最好在执行之前检查您的交易是否会失败。