dusmatoff
@dusmatoff
Web...

По какой причине persist может не работать в Doctrine?

Наткнулся на необычный баг. Есть endpoint в котором из базы тянется несколько десятков объектов, что-то обрабатывается и потом добавляются новые объекты.

//Упрощенный код
foreach ($items as $item) {
       $orderItem = OrderItem::createFromItem($order->getId(), $item);
      $this->entityManager->persist($orderItem);
}

$this->entityManager->flush();


Но в процессе, один persist не работает, то есть 1 объект не добавляется в базу. Прошелся дебагером и заметил, что spl_object_id в функции doPersist возвращает существующий id в entityState, поэтому insert не срабатывает.

6479e089c6b48398002340.png

Нашел https://github.com/doctrine/orm/issues/3037 Там пишут, что сборщик мусора может очистить какие то объекты и новые объекты могут иметь старое id. Видимо всё еще не исправили этот баг.


«Идентификатор объекта уникален на протяжении всего времени жизни объекта. После уничтожения объекта его идентификатор может быть повторно использован для других объектов».


Из доки php

Сейчас у меня работает так, но думаю это не оптимальный вариант. Какие варианты исправления можете рекомендовать и встречался ли вам такой баг в работе?
$this->entityManager->detach($orderItem);
$this->entityManager->persist($orderItem);
$this->entityManager->flush();
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы