有没有办法确定参数是否是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) {
}
}
答案 0 :(得分:52)
EntityManager->contains($entity)
现在是首选方式。
上一个答案:你必须像这样使用UnitOfWork api:
$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);
答案 1 :(得分:42)
EntityManager
方法contains
就是出于此目的。请参阅the documentation (2.4)。
在Doctrine 2.4中,实现如下:
class EntityManager {
// ...
public function contains($entity)
{
return $this->unitOfWork->isScheduledForInsert($entity)
|| $this->unitOfWork->isInIdentityMap($entity)
&& ! $this->unitOfWork->isScheduledForDelete($entity);
}
答案 2 :(得分:6)
检查实体是否已刷新的更简单,更健壮的方法,只需检查ID。
if (!$entity->getId()) {
echo 'new entity';
} else {
echo 'already persisted entity';
}
此解决方案非常依赖于案例,但它可能是最适合您的
编辑:
从评论看来,这不是最相关的答案,但可能对某些人有用,因为它与问题密切相关。