ソリューションは、私はそうのように、ルートエンティティRepository
クラスのスイッチャーを作成することです:
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();
}
}
その後、親クラッセでは、私はゲッターgetFqcn()
を行います次のようにしてください:
abstract class BaseEntity {
/**
* Get fqcn
*
* Fully Qualified Class Name
*
* @return string
*/
public static function getFqcn()
{
return get_called_class();
}
// ...
}
これは、レイトスタティックバインディング機能を使用して、私に具体的なオブジェクトの完全なクラス名を与えます( News
またはPage
)。
抽象化してインスタンス化しないようにします。
私はまた、具体的なクラス、いくつかの定数に追加
:私だけのタイプのいずれかに特化したファインダを作成することができます
class News extends Page {
const HUMAN_READABLE = "News";
const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation.
}
そのように、私のRepository
。
あなたは何をしようとしていますか?クラステーブルの継承を適切な方法で使用するかどうかはわかりません。 –
私はタイトル、テキスト、著者などのプロパティを持つ基本的なエンティティのページを持っています。ニュースはサマリー、コメントの関連付けなどのいくつかの追加のプロパティでそれを拡張します... おそらく単一のテーブルの継承を使用してこれを行うことができます結果が1つの大きなテーブルであるため、正しいアプローチだとは思わない。 –
私は何かが恋しいですか? ...なぜあなたは 'SELECT * FROM Page ...'を問い合わせることができますか? – Cobby