如何在Doctrine 2中将实体重新保存为另一行

假设我有实体$e 。 有没有任何通用的方式来存储它作为另一行,将具有相同的实体数据,但另一个主键?

为什么我需要这个:我正在实现某种时态数据库模式,而不是更新行,我只需要创build另一个。

尝试克隆并添加以下方法到您的实体

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

在坚持实体之前,您可能需要分离实体。 我现在没有我的开发机器来testing它。

 $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()方法来__clone() ID属性,因为从纯模型视图来看它是有意义的。

更新2

挖掘到Doctrine代码,这是因为生成的代理类实现__clone()这个重要的行

 unset($this->_entityPersister, $this->_identifier); 

以下是我使用的一个简单的策略,并不涉及过多的复杂性:

 $new->fromArray( $old->toArray() ); $new->id = NULL;