2013-07-12 53 views
25

有沒有方法可以確定參數是否已經被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) { 
    } 
} 

回答

37

你必須使用的UnitOfWork API這樣的:

$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity); 

編輯:正如@Andrew阿特金森表示,看起來EntityManager->contains($entity)現在的首選方式。

+16

UnitOfWork標記爲@internal。這通常意味着建議您刪除使用情況或將其替換爲其他構造。使用'EntityManager->包含($ entity)'應該是首選 –

35

EntityManager方法contains服務於此目的。見the documentation (2.4)

在學說2.4,實施看起來是這樣的:

class EntityManager { 
// ... 
public function contains($entity) 
{ 
    return $this->unitOfWork->isScheduledForInsert($entity) 
     || $this->unitOfWork->isInIdentityMap($entity) 
     && ! $this->unitOfWork->isScheduledForDelete($entity); 
} 
+0

這就是答案! – Mvorisek

5

更方便,更可靠的方法來檢查,如果實體是刷新與否,只是檢查的ID。

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

    echo 'new entity'; 

} else { 

    echo 'already persisted entity'; 

} 

該解決方案是非常依賴的情況下,但它可能是最適合你的


編輯:

從評論看來,這不是最相關的答案,然而,由於與問題密切相關,可能會對某人有用。

+1

持久對象是否已經擁有ID?我認爲這只是沖洗的情況 – arnaudbey

+0

@arnaudbey我認爲這是事實,這使得答案几乎無關緊要。將編輯答案 –

+0

在Doctrine中使用Postgresql數據庫時,這不起作用:將實體持久化到實體管理器和標識時歸於該實體。在這種情況下(使用postgresql),你可以檢查一個實體是否被持久化,而不是你是否在你的答案中提到的**被刷新**。爲了避免使用db之間的差異,應該使用API 。 –

相關問題