Intereting Posts

Как повторно сохранить объект как другую строку в Doctrine 2

Допустим, у меня есть сущность $e . Есть ли общий способ сохранить его как другую строку, которая будет иметь одни и те же данные сущности, но другой первичный ключ?

Зачем мне это нужно: я реализую какую-то временную схему базы данных и вместо обновления строки мне просто нужно создать другую.

Solutions Collecting From Web of "Как повторно сохранить объект как другую строку в Doctrine 2"

Попробуйте клонирование и добавьте следующий метод к вашему объекту

 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 объект $new получил новый идентификатор и был сохранен как новая строка в БД.

Я все равно оставил бы свойство ID с помощью метода __clone() поскольку он имеет смысл с точки зрения чистой модели.

Обновление 2

Копаясь в коде Doctrine, это происходит потому, что сгенерированные прокси-классы реализуют __clone() с помощью этой важной строки

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

Вот простая стратегия, которую я использовал, которая не связана с чрезмерной сложностью:

 $new->fromArray( $old->toArray() ); $new->id = NULL;