Я работаю над проектом, который использует 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]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_A2B07288ECC6147F'
Как я могу вернуть первичный ключ моего объекта в нулевое или автоматически увеличивающееся состояние?
=====
Upate: Использование
public function __clone(){
$this->id = null;
}
все еще приводит к той же ошибке. Полный текст ошибки:
An exception occurred while executing 'INSERT INTO documents (usageFrom, usageTo, status, workflow_identifier, created_date, modified_date, language_id, translationRoot_id, ownerGroup_id, responsibleUser_id, production_id, media_id, created_user, modified_user) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with 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]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_A2B07288ECC6147F'






Это не то, как работает Клонирование PHP. Думайте о __clone как о __construct. В методе __clone вы должны назначить новые значения для $this.
class Document
{
public function ___clone()
{
// simple as that
$this->id = null;
}
}
В вашем текущем коде $newObj будет выброшен, в то время как клонированный объект все еще имеет исходный идентификатор.
Кроме того, не забудьте клонировать дочерние объекты в методе __clone, если вы хотите создать глубокую копию, иначе вы получите две сущности, ссылающиеся на одних и тех же дочерних объектов. (Или после сохранения / перезагрузки: одна из сущностей потеряет своих дочерних элементов.)
Спасибо за Ваш ответ. Я обновил вопрос, чтобы показать, что произойдет, когда я попробую ваше предложение.
Индекс UNIQ_A2B07288ECC6147F находится в таблице документа или в одной из дочерних таблиц?
Ага - похоже, с ID не проблема. Из оператора MAKE TABLE для моей таблицы документов: UNIQUE KEY UNIQ_A2B07288ECC6147F (production_id), ... так что это хороший улов.
является ли объект production дочерним объектом document или независимым объектом?
Это отдельная сущность.
Вы не отсоединяли сущность и не очищали диспетчер сущностей, не так ли? Потому что похоже, что Doctrine снова пытается сохранить объект Production.
Верно - я не отсоединял сущность и не очищал диспетчер сущностей.
попробуйте с отделить или создайте конструктор копирования (или проверьте, работает ли этот ответ для вас)