Как определить, сохраняется ли объект 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) {
}
}
Ответы
Ответ 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';
}
Это решение очень сильно зависит от случая, но оно может быть лучшим для вас.
изменить:
Из комментариев видно, что это не самый релевантный ответ, однако может быть полезным для кого-то, поскольку он тесно связан с вопросом.