38

有没有办法确定一个参数是否是一个已经被 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) {
    }
}
4

3 回答 3

69

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

EntityManager->contains($entity)

是现在的首选方式。

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

$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity);
于 2013-07-15T08:20:16.353 回答
45

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);
}
于 2014-07-16T03:10:20.407 回答
7

检查实体是否已刷新的更简单、更可靠的方法,只需检查 ID。

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

    echo 'new entity';

} else { 

    echo 'already persisted entity';

}

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


编辑:

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

于 2015-01-19T16:32:09.767 回答