2012-02-03 29 views
15

Tôi có đoạn mã sau:Nhận tên thực thể từ đối tượng lớp

namespace Acme\StoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Acme\StoreBundle\Entity\User 
* 
* @ORM\Table(name="users") 
* @ORM\Entity() 
*/ 
class User { 
... 
} 

$user = new User(); 

Có ai biết làm thế nào bây giờ tôi có thể có được tên thực thể (AcmeStoreBundle:User) từ đối tượng User?

Trả lời

44

này nên luôn luôn làm việc (không trở lại của Proxy lớp):

$em = $this->container->get('doctrine')->getEntityManager(); 
$className = $em->getClassMetadata(get_class($object))->getName(); 

Như getClassMetadata bị phản đối, bây giờ bạn có thể sử dụng getMetadataFor

$entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($object))->getName(); 
+0

Có công việc không. Bất kỳ lợi thế nào so với cách tiếp cận của Wojciech? –

+0

Như @chopchop đã chỉ ra, các proxy như 'Proxy \ __ CG __ \ MyBundle \ Entity \ MyEntity' được xử lý một cách chính xác. Điều này đặc biệt quan trọng nếu bạn tìm nạp các entites từ một cơ sở dữ liệu. –

+1

Đây là giải pháp đúng! –

9

Chức năng PHP get_class() sẽ trả lại User và không gian tên (xem nhận xét trong tài liệu php).

+0

Mặc dù bạn là đúng, điều này cũng sẽ trả lại cho tôi thư mục thực thể trong đường dẫn namespaced, do đó, có tôi có thể dải này ra nhưng didnt biết nếu đã có một chức năng có sẵn trong học thuyết để có được giá trị này dự định – Matt

+2

Hãy cẩn thận bằng cách sử dụng phương pháp sin nó sẽ không làm việc mọi lúc. Doctrine sử dụng một số cache và sẽ tạo ra lớp proxy. Nếu bạn sử dụng phương pháp thins bạn sẽ có một cái gì đó như thế này "Proxy \ AcmeStoreBundleEntity \ Proxy" – Chopchop

+0

Xem giải pháp khác, get_class() có thể thất bại vì đôi khi nó trả về một lớp Proxy. "$ em-> getClassMetadata (get_class ($ object)) -> getName()" thì không. Điều này xử lý các lớp proxy một cách chính xác. – benske

7

getClassMetadata() bị phản đối và sẽ bị xóa trong tương lai. Sử dụng getMetadataFor() thay vì:

$entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($entity))->getName(); 

Hoặc một chức năng hoàn chỉnh:

/** 
* Returns Doctrine entity name 
* 
* @param mixed $entity 
* 
* @return string 
* @throws \Exception 
*/ 
private function getEntityName($entity) 
{ 
    try { 
     $entityName = $this->em->getMetadataFactory()->getMetadataFor(get_class($entity))->getName(); 
    } catch (MappingException $e) { 
     throw new \Exception('Given object ' . get_class($entity) . ' is not a Doctrine Entity. '); 
    } 

    return $entityName; 
} 
+0

Xin lỗi bạn đã bỏ qua câu hỏi này nhưng tôi đang đối mặt với vấn đề gần nhất với vấn đề này. Tôi có một kho lưu trữ thực thể tùy chỉnh mở rộng Doctrine's. Trong kho lưu trữ tùy chỉnh của tôi, tôi có một hàm đếm được cho là cung cấp cho tôi tổng số bản ghi cho bất kỳ thực thể nào phương thức này được gọi. Khi tôi làm một print_r tôi có thể nhìn thấy những gì tôi đang tìm kiếm nhưng không knw làm thế nào để có được nó. Phương thức "từ" của QueryBuilder của tôi cần phải được chuyển qua tên thực thể được truy vấn động. Bất kỳ giúp đỡ? – Maximum86

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