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

ezr*_*tre 31 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

Flo*_*ian 56

编辑:正如@Andrew Atkinson所说的那样

EntityManager->contains($entity)
Run Code Online (Sandbox Code Playgroud)

是现在的首选方式.

上一个答案:你必须像这样使用UnitOfWork api:

$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);
Run Code Online (Sandbox Code Playgroud)

  • UnitOfWork标记为@internal.这通常意味着建议您删除用法或将其替换为其他构造.使用`EntityManager-> contains($ entity)`应该是首选 (19认同)

Set*_*tin 43

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);
}
Run Code Online (Sandbox Code Playgroud)


And*_*son 6

检查实体是否被刷新的更简单,更健壮的方法,只需检查ID.

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

    echo 'new entity';

} else { 

    echo 'already persisted entity';

}
Run Code Online (Sandbox Code Playgroud)

此解决方案在很大程度上取决于案例,但它可能是最适合您的


编辑:

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