Как сбросить идентификатор клонированного объекта PHP - PullRequest
0 голосов
/ 28 июня 2018

Я работаю над проектом, который использует 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 ", ноль, ноль, ноль, ноль, 1, ноль, 1, 1]:

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

1 Ответ

0 голосов
/ 28 июня 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...