Symfony — Как сбросить идентификатор клонированного объекта PHP

Я работаю над проектом, который использует Docrtrine и Symfony 2.7. У меня есть объект Document, который я хочу клонировать, и мне, конечно же, нужно убедиться, что у меня нет дублированного первичного ключа. Вот что я пытался сделать до сих пор:

/**
* Document
*
* @ORM\Table(name="documents")
*/
class Document {
public function ___clone(){
$newObj = clone $this;
$newObj->id = null;
return $newObj;
}
...
}

Это, кажется, не так много, как, например, когда я звоню clone myDocument и затем попытаться сохраниться, я все еще получаю это сообщение:

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись
«1» для ключа «UNIQ_A2B07288ECC6147F»

Как я могу получить первичный ключ моего объекта, чтобы вернуться к нулевому или автоинкрементному состоянию?

=====

Upate: Использование

public function __clone(){
$this->id = null;
}

по-прежнему приводит к той же ошибке. Полный текст ошибки:

Возникла исключительная ситуация при выполнении документов INSERT INTO
(UseFrom, UseTo, статус, рабочий поток_идентификатор, создан_дата,
измененная дата, language_id, translationRoot_id, ownerGroup_id,
idUser_id, production_id, media_id, создал_пользователя,
updated_user) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?,?,?,?,?,?,?) ‘с
params [«2018-06-28 09:54:37», «2018-06-28 09:54:37», 100,
«4cc723c2a5730c1b9c2ed6428ae57205», «2018-06-28 09:54:37», «2018-06-28
09:54:37 «, null, null, null, null, 1, null, 1, 1]:

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись
«1» для ключа «UNIQ_A2B07288ECC6147F»

3

Решение

Это не как Клонирование PHP работает. Думать о __clone как из __construct, в __clone метод, вы должны присвоить новые значения $this,

class Document
{
public function ___clone()
{
// simple as that
$this->id = null;
}
}

В вашем текущем коде $newObj будет выброшен, в то время как клонированный объект все еще имеет исходный идентификатор.

Кроме того, не забудьте клонировать дочерние объекты в вашем __clone метод, если вы хотите создать глубокую копию, в противном случае вы получите две сущности, ссылающиеся на одних и тех же потомков. (Или после сохранения / перезагрузки: одна из сущностей потеряет своих потомков.)

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector