首页 > 解决方案 > 如何使用 Symfony 原则从我的数据库中克隆所有数据?

问题描述

我尝试克隆我的data实体中具有item值的所有记录cf7c1ae00f

    $dataEntity= new Data();
    $cloneArray = $this->em->getRepository(Data::class)->findBy(['item' => 'cf7c1ae00f']);

    foreach ($cloneArray as $cloneItem) {
      $fieldClone = clone $cloneItem;
      $dataEntity->setItem($fieldClone);
      $this->em->persist($dataEntity);
    }
    $this->em->flush();

在我的数据库中有 5 条记录。所以我希望再添加 5 条记录。但是只添加了一条记录。

标签: phpsymfonydoctrineentityclone

解决方案


您正在$dataEntity用不同的内容编写相同的 5 次。您可以在循环中构造该对象来解决您的问题,但您也可以$fieldClone直接保留并完全跳过该$dataEntity变量。

但是,实体具有唯一的 ID,当您尝试持久化克隆的实体时会导致错误。您必须清空集合/数据库中必须唯一的 id 和其他属性。

clone使用关键字时,您可以使用__clone()对象所属类的方法轻松地在新对象上设置一些初始值。

因此,如果您只需要清空 id,您将向Data该类添加一个克隆方法并将循环更改为:

数据类:

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

克隆代码:

$cloneArray = $this->em->getRepository(Data::class)->findBy(['item' => 'cf7c1ae00f']);

foreach ($cloneArray as $cloneItem) {
    # Clone the object and automatically run the `__clone()` method of the class
    $fieldClone = clone $cloneItem;
    $this->em->persist($fieldClone);
}
$this->em->flush();

推荐阅读