Допустим, у меня есть сущность $e
. Есть ли общий способ сохранить его как другую строку, которая будет иметь одни и те же данные сущности, но другой первичный ключ?
Зачем мне это нужно: я реализую какую-то временную схему базы данных и вместо обновления строки мне просто нужно создать другую.
Попробуйте клонирование и добавьте следующий метод к вашему объекту
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()
поскольку он имеет смысл с точки зрения чистой модели.
Копаясь в коде Doctrine, это происходит потому, что сгенерированные прокси-классы реализуют __clone()
с помощью этой важной строки
unset($this->_entityPersister, $this->_identifier);
Вот простая стратегия, которую я использовал, которая не связана с чрезмерной сложностью:
$new->fromArray( $old->toArray() ); $new->id = NULL;