Как повторно сохранить сущность как еще один ряд в Учении 2 - PullRequest
67 голосов
/ 31 января 2012

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

Зачем мне это нужно: я реализую некую схему Temporal Database , и вместо обновления строки мне просто нужно создать еще одну.

Ответы [ 2 ]

146 голосов
/ 31 января 2012

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

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

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

Обновление 2

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

unset($this->_entityPersister, $this->_identifier);
0 голосов
/ 22 ноября 2013

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

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