53

に関係のあるエンティティAを作成しました。OneToManyBOneToManyC

Aこのエンティティのクローンを作成し、新しいIDでデータベースに設定する必要があります。また、すべての深い関係も新しいIDで複製する必要があります。

私が試したことは、Aidをnull次のように設定することです。

$A = clone $A_original;
$A->setId(null);
$em->persist($A);

テーブルに新しいレコードを作成しますが、とには作成Aしません。BC

Aエンティティの完全なコピーを作成するにはどうすればよいですか?

4

3 に答える 3

82

__clone()IDをnullに設定し、必要に応じてリレーションを複製するメソッドをエンティティ に実装する必要があります。関連するオブジェクトにIDを保持すると、新しいエンティティAが既存のエンティティBおよびとの関係を持っていると見なされるためCです。

クローンメソッドA

public function __clone() {
    if ($this->id) {
        $this->setId(null);
        $this->B = clone $this->B;
        $this->C = clone $this->C;
    }
}

BおよびのクローンメソッドC

public function __clone() {
    if ($this->id) {
        $this->setId(null);
    }
}

https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/Nu2rayrDkgQ

https://doctrine-orm.readthedocs.org/en/latest/cookbook/implementing-wakeup-or-clone.html

coder4showのコメントに基づいて、OneToManyがAどこに$this->Mあるかに関するOneToMany関係のクローンメソッド、したがってArrayCollection

public function __clone() {
    if ($this->id) {
        $this->setId(null);

        // cloning the relation M which is a OneToMany
        $mClone = new ArrayCollection();
        foreach ($this->M as $item) {
            $itemClone = clone $item;
            $itemClone->setA($this);
            $mClone->add($itemClone);
        }
        $this->M = $mClone;
    }
}
于 2013-01-04T14:16:50.777 に答える
9

DeepCopyと呼ばれるこれを行うモジュールもあります。

https://github.com/myclabs/DeepCopy

$deepCopy = new DeepCopy();
$myCopy   = $deepCopy->copy($myObject);

フィルタを追加して、コピープロセスをカスタマイズすることもできます。

于 2014-11-14T10:52:47.017 に答える
2

DeepCloneを使用できなかったため(php 7.1以降が必要)、エンティティ__cloneメソッドでリレーションを複製するためのより簡単な方法を確立しました。

$this->tags = new ArrayCollection($this->tags->toArray());
于 2018-02-28T17:40:54.317 に答える