web-dev-qa-db-ja.com

Doctrine 2の別の行としてエンティティを再保存する方法

エンティティ$eがあるとします。別の行として保存する一般的な方法はありますか?別の行には、同じエンティティデータがありますが、別の主キーがありますか?

これが必要な理由:ある種の Temporal Database スキーマを実装しており、行を更新する代わりに別のスキーマを作成するだけです。

68
zerkms

クローンを作成して、エンティティに次のメソッドを追加してください

_public function __clone() {
    $this->id = null;
}
_

エンティティを永続化する前に detach する必要があるかもしれません。私は今、これをテストするのに便利な開発マシンを持っていません。

_$f = clone $e;
$em->detach($f);
$em->persist($f);
$em->flush();
_

更新

単純なSQLiteデモを使用してみました。何もする必要はないはずです。以下は__clone()メソッドを追加したり、通常とは違う何かをすることなく私のために働いた

_$new = clone $old;
$em->persist($new);
$em->flush();
_

フラッシュすると、_$new_エンティティは新しいIDを持ち、DBに新しい行として保存されました。

純粋なモデルビューからは理にかなっているので、__clone()メソッドを介してIDプロパティをnullのままにします。

更新2

Doctrine=コードを掘り下げます。これは、生成されたプロキシクラスがこの重要な行で__clone()を実装するためです。

_unset($this->_entityPersister, $this->_identifier);
_
149
Phil