php 如何将实体重新保存为教义2中的另一行

62o28rlo  于 12个月前  发布在  PHP
关注(0)|答案(4)|浏览(55)

假设我有一个实体$e。是否有任何通用的方法将其存储为另一行,这将具有相同的实体数据,但另一个主键?
为什么我需要这个:我正在实现某种Temporal Database模式,而不是更新行,我只需要创建另一个。

zqry0prt

zqry0prt1#

尝试克隆并将以下方法添加到实体中

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

您可能需要在持久化实体之前分离该实体。我没有我的开发机器方便测试这一点现在。

$f = clone $e;
$em->detach($f);
$em->persist($f);
$em->flush();

更新

我尝试了一个简单的SQLite demo。你不需要做任何事。下面的代码对我来说很有用,不需要添加__clone()方法或做任何其他不寻常的事情

$new = clone $old;
$em->persist($new);
$em->flush();

一旦刷新,$new实体就有了一个新的ID,并被保存为DB中的一个新行。
我仍然会通过__clone()方法空化ID属性,因为从纯模型的Angular 来看,它是有意义的。

更新2

深入研究Doctrine代码,这是因为生成的代理类使用这一重要行实现了__clone()

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

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();
voase2hg

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

oaxa6hgo

oaxa6hgo4#

将数据复制到同一个类的新Object中并持久化它就可以了。保持简单!

相关问题