Как я могу клонировать все данные из моей базы данных с доктриной Symfony? - PullRequest
2 голосов
/ 08 апреля 2019

Я пытаюсь клонировать все записи в моем 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 записей будут добавлены. Но добавлена ​​только одна запись.

1 Ответ

1 голос
/ 08 апреля 2019

Вы пишете одно и то же $dataEntity 5 раз с разным содержанием.Вы можете создать этот объект в цикле, чтобы решить вашу проблему, но вы также можете вместо этого сохранить $fieldClone напрямую и полностью пропустить переменную $dataEntity.

Однако у сущностей есть уникальные идентификаторы, и это приведет к ошибкам, когдаВы пытаетесь сохранить клонированную сущность.Вам придется очистить id и другие атрибуты, которые должны быть уникальными в коллекции / базе данных.

Вы можете легко установить некоторые начальные значения для нового объекта, когда используется ключевое слово clone, используя __clone() метод класса, к которому принадлежит объект.

Поэтому, если вам нужно только очистить идентификатор, вы бы добавили метод клона в класс 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();
...