如何在Doctrine中附加分离的实体?

时间:2016-03-10 19:11:31

标签: doctrine-orm entity entitymanager unit-of-work detach

我有一个脚本,它在循环中将一些类型为“A”的新实体保存到数据库中。但是循环可以抛出一些关闭entityManager的异常。所以必须重新打开。它导致应该与每个“A”实体连接的另一个类型为“B”的实体与unitOfWork分离。如何将“B”附加到unitOfWork?这是一个例子:

public function insert( Array $items )
{
    $B = $this->bRepository->findOneBy( ['name' => 'blog'] );
    $result = [ 'errors' => [], 'saved_items' => [] ];

    foreach( $items as $item )
    {
        try
        {
            $A = new Entity\A();
            $A->create([
                'name' => $item->name,
                'B' => $B // Here is the problem after exception. $B is detached.
            ]);
            $this->em->persist( $A );
            $this->em->flush( $A );
            $result['saved_items'][] = $item->name;
        } catch( \Eception $e )
        {
            $result['errors'][] = 'Item ' . $item->name . ' was not saved.';
            $this->em = $this->em->create( $this->em->getConnection(), $this->em->getConfiguration() );             
        }
    }

    return $result;
}

我试过$this->em->persist($B),但它让我在数据库中重复了$ B。它表示DB中的新B项(带有新ID),而不是在A和B之间创建连接。我也尝试了$this->em->merge($B)但它抛出异常“通过关系找到了一个新实体'App \ Model \ Entity \ A#B'未配置为级联持久操作“。如何处理这个问题?

非常感谢。

1 个答案:

答案 0 :(得分:3)

因此,如果在这种情况下像$ B实体那样合并某些内容,则需要通过=运算符进行分配。因为merge()RETURNS实体。它不会影响原始实体。

catch( \Exception $e )
{
    ...
    $B = $this->em->merge( $B );
}