2011-02-19 34 views
5

Tôi có hai thực thể - Tin tức và Trang. Definition trông như thế này:Học thuyết 2 - Bảng thừa kế, chọn theo loại

 
/** 
* Description of Page 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({ 
* "news" = "News" , 
* "page" = "Page"}) 
* 
* @table(
* name="pages" 
*) 
*/ 
class Page extends BaseEntity {...} 
class News extends Page {...} 

Tôi biết, làm thế nào để chọn chỉ "tin tức" thực thể - đơn giản SELECT ... FROM News n.

Nhưng có cách nào để chỉ chọn các thực thể "trang", được ánh xạ trực tiếp đến lớp Trang không? Hoặc tôi có phải tạo thêm một số thực thể mở rộng cho Trang này không?

+0

Bạn đang cố gắng làm gì? Tôi không chắc chắn bạn sử dụng Class Table Inheritance một cách thích hợp. –

+0

Tôi có trang thực thể cơ bản, có các thuộc tính như tiêu đề, văn bản, tác giả vv Tin tức mở rộng nó với một số thuộc tính bổ sung như tóm tắt, liên kết nhận xét ... Có thể thực hiện điều này bằng cách sử dụng thừa kế bảng đơn, nhưng tôi thực hiện không nghĩ đó là cách tiếp cận đúng, bởi vì kết quả là một bảng lớn. –

+0

Tôi đã bỏ lỡ điều gì đó? ... Tại sao bạn có thể truy vấn 'SELECT * FROM Page ...'? – Cobby

Trả lời

0

Các giải pháp, mà tôi sử dụng là tôi tạo ra một Switcher trên lớp thực thể gốc Repository, như vậy:

class PageRepository extends EntityRepository 
{ 
    protected $_switchEntityNameSave = null; 

    /** 
    * @param type $fqcn 
    */ 
    protected function _swapEntityDiscriminator($fqcn = null){ 
    if(isset($fqcn)){ 
     $this->_switchEntityNameSave = $this->_entityName; 
     $this->_entityName = $fqcn; 
    } else { 
     $this->_entityName = $this->_switchEntityNameSave; 
     unset($this->_switchEntityNameSave); 
    } 
    } 

    // ... AND TO USE... 

    public function findSomeStuff() 
    { 
    $this->_swapEntityDiscriminator(News::getFqcn()); 
    // The query, the result in a variable, $q for example 
    $this->_swapEntityDiscriminator(); 
    return $q->getQuery(); 
    } 

} 

Sau đó, trong classe mẹ, tôi làm Getter getFqcn() , giống như vậy:

abstract class BaseEntity { 
    /** 
    * Get fqcn 
    * 
    * Fully Qualified Class Name 
    * 
    * @return string 
    */ 
    public static function getFqcn() 
    { 
     return get_called_class(); 
    } 
    // ... 
} 

Sử dụng tính năng kết buộc tĩnh muộn và cho tôi tên đầy đủ trên vật thể bê tông (hoặc News hoặc Page).

Tôi đặt trừu tượng, để chắc chắn không khởi tạo nó.

Những gì tôi cũng thêm vào các lớp bê tông, một vài hằng số:

class News extends Page { 
    const HUMAN_READABLE = "News"; 
    const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation. 

} 

Bằng cách đó, tôi Repository tôi có thể tạo Finders chuyên ngành chỉ vào một trong các loại.

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