Наткнулся на необычный баг. Есть 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 не срабатывает.
Нашел
https://github.com/doctrine/orm/issues/3037 Там пишут, что сборщик мусора может очистить какие то объекты и новые объекты могут иметь старое id. Видимо всё еще не исправили этот баг.
«Идентификатор объекта уникален на протяжении всего времени жизни объекта. После уничтожения объекта его идентификатор может быть повторно использован для других объектов».
Из доки
php
Сейчас у меня работает так, но думаю это не оптимальный вариант. Какие варианты исправления можете рекомендовать и встречался ли вам такой баг в работе?
$this->entityManager->detach($orderItem);
$this->entityManager->persist($orderItem);
$this->entityManager->flush();