81

私がエンティティを持っているとしましょう$e。同じエンティティデータであるが別の主キーを持つ別の行として保存する一般的な方法はありますか?

これが必要な理由:ある種の時制データベーススキーマを実装していて、行を更新する代わりに、別のスキーマを作成する必要があります。

4

4 に答える 4

176

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

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

エンティティを永続化する前に、エンティティを切り離す必要がある場合があります。現在、これをテストするための開発マシンが手元にありません。

$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);
于 2012-01-30T21:42:41.387 に答える
0

私はただします:

/**
 * __clone
 *
 * @return void
 */
public function __clone()
{
    $this->id = null;
}

詳細はこちらhttps://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/implementing-wakeup-or-clone.html

于 2020-10-02T18:32:45.523 に答える
0

同じクラスの新しいオブジェクトにデータをコピーして永続化することで問題ありません。単純にする!

于 2021-01-14T18:25:14.047 に答える
-4

これが私が使用した単純な戦略であり、過度の複雑さは含まれていません。

$new->fromArray( $old->toArray() );
$new->id = NULL;
于 2013-11-21T21:13:22.517 に答える