尝试克隆并向您的实体添加以下方法
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。
深入研究 Doctrine 代码后发现,这是因为生成的代理类使用了这个重要的语句实现了 __clone()
方法。
unset($this->_entityPersister, $this->_identifier);
$em->refresh($old)
和 $em->detach($old)
都似乎不起作用... - Chadwick Meyer$new entity
。使用 $em->flush($new);
而不是 $em->flush();
,否则两个实体都将保存新数据。 - Josh $new = clone $discount;
$new->setId(null);
$discountRequest = new DiscountRequest();
$discountRequest->setDiscount($new);
$discountRequest->setOldDiscount($discount->getId());
$entityManager->persist($discountRequest);
$entityManager->detach($discount);
$entityManager->flush();
我只是做:
/**
* __clone
*
* @return void
*/
public function __clone()
{
$this->id = null;
}
将数据复制到同一类的新对象中并持久化即可。保持简单!
$f = clone $e
吗?可能需要实现__clone()
方法。 - Philspl_object_hash
(Doctrine用它来识别特定的实例)对于原始对象和克隆对象是相同的,即使它们包含不同的数据。 - zerkms__clone()
也没用 - Doctrine使用$oid = spl_object_hash($entity);
和一些内部映射来获取对象的状态。对于原始的对象和克隆的对象来说,它们的状态都是相同的 -MANAGED
。 - zerkms