Как получить изменения в single associations в onFlush в doctrine event listener?

Для того чтобы получить изменения в единичных ассоциациях (single associations) в событии onFlush в Doctrine event listener, нужно изучить информацию о состоянии объектов, которые были изменены во время действия транзакции.

Событие onFlush происходит перед фиксацией изменений в базе данных и предоставляет доступ к измененным объектам, которые хранятся в EntityManager-е. Во время этого события можно получить доступ к состоянию объектов через метод getUnitOfWork() у EntityManager, а затем использовать метод getEntityChangeSet для получения изменений в определенных ассоциациях.

Пример кода может выглядеть следующим образом:

use DoctrineORMEventOnFlushEventArgs;

class YourEventListener
{
    public function onFlush(OnFlushEventArgs $eventArgs)
    {
        $entityManager = $eventArgs->getEntityManager();
        $unitOfWork = $entityManager->getUnitOfWork();

        foreach ($unitOfWork->getScheduledEntityUpdates() as $entity) {
            $changeset = $unitOfWork->getEntityChangeSet($entity);

            // Проверяем, содержит ли changeset изменения в конкретной ассоциации (связи)
            if (array_key_exists('associationName', $changeset)) {
                $oldValue = $changeset['associationName'][0];
                $newValue = $changeset['associationName'][1];

                // делаем что-то с новым и старым значением
            }
        }
    }
}

В приведенном коде мы получаем scheduled entity updates из UnitOfWork и проходимся по каждому измененному объекту. Затем, используя метод getEntityChangeSet, мы получаем changeset для каждого объекта и проверяем содержит ли он изменения в конкретной ассоциации с помощью array_key_exists. Если да, то мы можем получить старое значение до изменения и новое значение после изменения из changeset и производить необходимые действия.

Важно отметить, что событие onFlush вызывается для всех измененных объектов, поэтому нужно учитывать, что изменения в ассоциациях могут быть связаны с различными объектами. Кроме того, обратите внимание, что этот пример относится к Doctrine ORM для Symfony. Для других версий Doctrine или других фреймворков, способы доступа к изменениям в ассоциациях могут быть различными.