Как сбросить идентификатор клонированного объекта 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]: 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'

попробуйте с отделить или создайте конструктор копирования (или проверьте, работает ли этот ответ для вас)

Matteo 28.06.2018 12:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
707
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Спасибо за Ваш ответ. Я обновил вопрос, чтобы показать, что произойдет, когда я попробую ваше предложение.

Patrick 28.06.2018 13:40

Индекс UNIQ_A2B07288ECC6147F находится в таблице документа или в одной из дочерних таблиц?

lxg 28.06.2018 13:51

Ага - похоже, с ID не проблема. Из оператора MAKE TABLE для моей таблицы документов: UNIQUE KEY UNIQ_A2B07288ECC6147F (production_id), ... так что это хороший улов.

Patrick 28.06.2018 14:06

является ли объект production дочерним объектом document или независимым объектом?

lxg 28.06.2018 14:16

Это отдельная сущность.

Patrick 28.06.2018 14:16

Вы не отсоединяли сущность и не очищали диспетчер сущностей, не так ли? Потому что похоже, что Doctrine снова пытается сохранить объект Production.

lxg 28.06.2018 14:18

Верно - я не отсоединял сущность и не очищал диспетчер сущностей.

Patrick 28.06.2018 14:22

Другие вопросы по теме