Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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);

Ответ 2

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

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