Я работаю над проектом, который использует 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»
Это не как Клонирование PHP работает. Думать о __clone
как из __construct
, в __clone
метод, вы должны присвоить новые значения $this
,
class Document
{
public function ___clone()
{
// simple as that
$this->id = null;
}
}
В вашем текущем коде $newObj
будет выброшен, в то время как клонированный объект все еще имеет исходный идентификатор.
Кроме того, не забудьте клонировать дочерние объекты в вашем __clone
метод, если вы хотите создать глубокую копию, в противном случае вы получите две сущности, ссылающиеся на одних и тех же потомков. (Или после сохранения / перезагрузки: одна из сущностей потеряет своих потомков.)
Других решений пока нет …