Ответ 1
Попробуйте клонировать и добавьте следующий метод к вашей сущности
public function __clone() {
$this->id = null;
}
Возможно, вам понадобится detach объект, прежде чем он будет продолжать работу. У меня нет моей машины-разработчика, которая бы проверила это прямо сейчас.
$f = clone $e;
$em->detach($f);
$em->persist($f);
$em->flush();
Update
Просто попробовал простую демонстрацию SQLite. Вам не нужно ничего делать. Следующие работали для меня, не добавляя метод __clone()
или ничего не делая из обычного
$new = clone $old;
$em->persist($new);
$em->flush();
После очистки объект $new
имел новый идентификатор и был сохранен как новая строка в БД.
Я все равно оставил бы свойство ID с помощью метода __clone()
, поскольку он имеет смысл с чистого представления модели.
Обновление 2
Копаем в код Doctrine, это связано с тем, что сгенерированные прокси-классы реализуют __clone()
с помощью этой важной строки
unset($this->_entityPersister, $this->_identifier);