由于唯一违规,EntityManager已关闭

时间:2017-06-27 10:59:52

标签: php symfony doctrine-orm

我使用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
}

2 个答案:

答案 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:

  

当关闭对象管理器时,此方法很有用   一个回滚事务和当你认为它有意义时   得到一个新的替换封闭的。

然而,在执行之前检查您的交易是否会失败会更好。