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