0

symfony2 アプリケーションのコーディング中に、ここで問題に直面しています。

状況: エンティティ "A" のコピーを作成し、その属性 "foo" を変更したいと考えています。ただし、A と Foo は OneToOne の関係で関連付けられているため、エラーが発生します。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '9' for key 
UNIQ_41A6A445D7FA9592

私のエンティティは次のとおりです。

/**
 * AcmeBundle\Entity\A
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AcmeBundle\Entity\ARepository")
 */

class A
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */    
    protected $id;

    /**
    * @ORM\OneToOne(targetEntity="Mvcc\AcmeBundle\Entity\Foo")
    * 
    */ 
    protected foo;

    getFoo(){
        return $this->foo;
    }

    setFoo($foo){
        $this->foo = $foo;
        return $this;
    }          


}

問題:コントローラーで次のことを行います。

/*start*/
/*1) I create a clone aBis of a, instance of A.its foo attribute is connected to foo1.*/
$aBis = clone($a);
/*2) I modify the attribute foo for a */
$foo2 = new Foo();
$a->setFoo($foo2);
$em->persist($foo2)
$em->persist($aBis);
$em->persist($a);
$em->flush();

/*end*/

フラッシュに関しては、ある時点で「a」と「aBis」の両方が属性 foo1 を持っているという事実により、doctrine が続行できず、$a がその属性を新しい foo に変更したことを確認できないと思います。これを解決する方法はありますか?

私の実際の問題はもう少し複雑です (より深い関係と作業単位が関係しています)。ただし、ここで主な問題を要約したと思います。

よろしくお願いします!

よろしく、

4

1 に答える 1

0

関係を持つエンティティを複製する場合は、関係public function __clone()するすべてのエンティティに を実装します

あなたのエンティティの例:

public function __clone()
{
    if ($this->id) {
        // if the $foo property is a ManyToMany, ManyToOne or OneToMany
        $foo = $this->getFoo();
        $this->foo = new ArrayCollection();
        foreach ($foo as $row) {
            $this->foo[] = $row;
        }
        // if the $foo property is a OneToOne
        $foo = $this->getFoo();
        $this->foo = clone $foo;
    }
}

あなたのコントローラーで:

$myOriginal = new A();
$myClone = clone $myOriginal;
// then persist
$em->persist($myClone);
// and flush
$em->flush();

エンティティのOneToMany実装:

/**
 * AcmeBundle\Entity\A
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AcmeBundle\Entity\ARepository")
 */
class A
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */    
    protected $id;

    /**
    * @ORM\OneToMany(targetEntity="Mvcc\AcmeBundle\Entity\Foo")
    * @ORM\JoinColumns({
    *   @ORM\JoinColumn(name="foo_id", referencedColumnName="id")
    * })
    */ 
    protected foo;

    getFoo(){
        return $this->foo;
    }

    setFoo($foo){
        $this->foo = $foo;
        return $this;
    }  
于 2013-11-13T13:45:36.767 に答える