假设我有一个实体$e。是否有任何通用的方法将其存储为另一行,这将具有相同的实体数据,但另一个主键?为什么我需要这个:我正在实现某种Temporal Database模式,而不是更新行,我只需要创建另一个。
$e
zqry0prt1#
尝试克隆并将以下方法添加到实体中
public function __clone() { $this->id = null; }
您可能需要在持久化实体之前分离该实体。我没有我的开发机器方便测试这一点现在。
$f = clone $e; $em->detach($f); $em->persist($f); $em->flush();
我尝试了一个简单的SQLite demo。你不需要做任何事。下面的代码对我来说很有用,不需要添加__clone()方法或做任何其他不寻常的事情
__clone()
$new = clone $old; $em->persist($new); $em->flush();
一旦刷新,$new实体就有了一个新的ID,并被保存为DB中的一个新行。我仍然会通过__clone()方法空化ID属性,因为从纯模型的Angular 来看,它是有意义的。
$new
深入研究Doctrine代码,这是因为生成的代理类使用这一重要行实现了__clone()
unset($this->_entityPersister, $this->_identifier);
vlju58qv2#
clone和detach对我很有效。Symfony版本5. 4不接受flush()的任何参数
$new = clone $discount; $new->setId(null); $discountRequest = new DiscountRequest(); $discountRequest->setDiscount($new); $discountRequest->setOldDiscount($discount->getId()); $entityManager->persist($discountRequest); $entityManager->detach($discount); $entityManager->flush();
voase2hg3#
我只是做:
/** * __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
oaxa6hgo4#
将数据复制到同一个类的新Object中并持久化它就可以了。保持简单!
4条答案
按热度按时间zqry0prt1#
尝试克隆并将以下方法添加到实体中
您可能需要在持久化实体之前分离该实体。我没有我的开发机器方便测试这一点现在。
更新
我尝试了一个简单的SQLite demo。你不需要做任何事。下面的代码对我来说很有用,不需要添加
__clone()
方法或做任何其他不寻常的事情一旦刷新,
$new
实体就有了一个新的ID,并被保存为DB中的一个新行。我仍然会通过
__clone()
方法空化ID属性,因为从纯模型的Angular 来看,它是有意义的。更新2
深入研究Doctrine代码,这是因为生成的代理类使用这一重要行实现了
__clone()
vlju58qv2#
clone和detach对我很有效。Symfony版本5. 4不接受flush()的任何参数
voase2hg3#
我只是做:
更多详情https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/implementing-wakeup-or-clone.html
oaxa6hgo4#
将数据复制到同一个类的新Object中并持久化它就可以了。保持简单!