如何确定Doctrine实体是否持久化?

时间:2013-07-12 11:14:17

标签: doctrine-orm

有没有办法确定参数是否是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) {
    }
}

3 个答案:

答案 0 :(得分:52)

编辑:正如@Andrew Atkinson所说,似乎

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';

}

此解决方案非常依赖于案例,但它可能是最适合您的


编辑:

从评论看来,这不是最相关的答案,但可能对某些人有用,因为它与问题密切相关。