Подтвердить что ты не робот

Как определить, сохраняется ли объект Doctrine?

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

<?php
public function updateStatus(Entity $entity, EntityStatus $entityStatus)
{
    $entityManager = $this->getEntityManager();
    try {
        // checking persisted entity
        if (!$entityManager->isPersisted($entity)) { 
            throw new InvalidArgumentException('Entity is not persisted');
        }
        // ...
    } catch (InvalidArgumentException $e) {
    }
}
4b9b3361

Ответ 1

Вы должны использовать unitOfWork api следующим образом:

$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);

EDIT: Как сказал @Andrew Atkinson, кажется, что EntityManager->contains($entity) является предпочтительным способом.

Ответ 2

Метод EntityManager contains служит для этой цели. См. документацию (2.4).

В Doctrine 2.4 реализация выглядит так:

class EntityManager {
// ...
public function contains($entity)
{
    return $this->unitOfWork->isScheduledForInsert($entity)
        || $this->unitOfWork->isInIdentityMap($entity)
        && ! $this->unitOfWork->isScheduledForDelete($entity);
}

Ответ 3

Более простой и надежный способ проверить, является ли объект очищенным или нет, просто проверьте идентификатор.

if (!$entity->getId()) {

    echo 'new entity';

} else { 

    echo 'already persisted entity';

}

Это решение очень сильно зависит от случая, но оно может быть лучшим для вас.


изменить:

Из комментариев видно, что это не самый релевантный ответ, однако может быть полезным для кого-то, поскольку он тесно связан с вопросом.