2013-07-12 27 views
25

Có cách nào để xác định xem một tham số có phải là một đối tượng đã được Doctrine tiếp tục tồn tại hay không? Một cái gì đó giống như một phương thức quản lý thực thể để kiểm tra rằng một đối tượng không phải là một đối tượng cũ đơn giản nhưng thực sự đã có một cái gì đó trong bộ nhớ/vẫn tồn tại.Làm thế nào để xác định xem một thực thể Doctrine có tiếp tục không?

<?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) { 
    } 
} 

Trả lời

37

Bạn phải sử dụng UnitOfWork api như thế này:

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

EDIT: Như đã nói bởi @ Andrew Atkinson, có vẻ như EntityManager->contains($entity) là cách ưa thích bây giờ.

+16

UnitOfWork được đánh dấu @internal. Điều này thường có nghĩa là bạn nên loại bỏ việc sử dụng hoặc thay thế nó bằng các cấu trúc khác. Sử dụng 'EntityManager-> chứa ($ entity)' nên được ưa thích –

35

Phương thức EntityManagercontains phục vụ mục đích này. Xem the documentation (2.4).

Trong Học thuyết 2.4, việc thực hiện trông như thế này:

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

Đây là câu trả lời! – Mvorisek

5

Một cách dễ dàng hơn và mạnh mẽ hơn để kiểm tra xem đơn vị là đỏ mặt hay không, chỉ cần kiểm tra ID.

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

    echo 'new entity'; 

} else { 

    echo 'already persisted entity'; 

} 

Giải pháp này là rất nhiều phụ thuộc vào trường hợp, nhưng nó có thể là tốt nhất cho bạn


chỉnh sửa:

Từ ý kiến ​​dường như đây không phải là câu trả lời phù hợp nhất, tuy nhiên có thể hữu ích cho ai đó vì nó liên quan chặt chẽ đến câu hỏi.

+1

Các đối tượng có tồn tại lâu dài đã có id chưa? Tôi nghĩ rằng đó là trường hợp cho những người đỏ mặt chỉ – arnaudbey

+0

@arnaudbey Tôi nghĩ rằng đây là trường hợp, mà làm cho câu trả lời gần như không liên quan. sẽ chỉnh sửa câu trả lời –

+0

Điều này sẽ không hoạt động khi sử dụng cơ sở dữ liệu Postgresql với Doctrine: khi các thực thể bền bỉ cho trình quản lý thực thể và id được gán cho thực thể. Trong trường hợp này (sử dụng postgresql), bạn có thể kiểm tra xem thực thể có tồn tại hay không, không phải nếu nó được xóa bỏ ** như bạn đã đề cập trong câu trả lời ... Để thoát khỏi sự khác biệt giữa sử dụng db, API nên được sử dụng . –

Các vấn đề liên quan