如何将实体重新保存为原则 2 中的另一行

问题描述 投票:0回答:5

假设我有实体

$e
。是否有任何通用方法将其存储为另一行,该行将具有相同的实体数据但另一个主键?

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

php doctrine doctrine-orm temporal-database
5个回答
185
投票

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,并被保存为数据库中的新行。


我仍然会通过

__clone()

方法将 ID 属性设为 null,因为从纯模型视图来看它是有意义的。


更新2

深入研究 Doctrine 代码,这是因为生成的代理类通过这一重要行实现了

__clone()


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



1
投票

$new = clone $discount; $new->setId(null); $discountRequest = new DiscountRequest(); $discountRequest->setDiscount($new); $discountRequest->setOldDiscount($discount->getId()); $entityManager->persist($discountRequest); $entityManager->detach($discount); $entityManager->flush();



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


0
投票

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



-2
投票

© www.soinside.com 2019 - 2024. All rights reserved.