我有两个实体 - 新闻和页面。 定义如下:
/** * 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 {...}
我知道,如何只选择“新闻”实体 - 简单SELECT ... FROM News n
。
但有没有办法如何只选择“页面”实体,它们直接映射到Page类?或者我是否必须为此创建一些额外的实体扩展页面?
答案 0 :(得分:12)
解决方案是在WHERE子句中使用x INSTANCE OF Entity
。
http://groups.google.com/group/doctrine-user/browse_thread/thread/b1dc52ed447204e2
答案 1 :(得分:1)
我使用的解决方案是在根实体Repository
类上创建一个Switcher,如下所示:
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();
}
}
然后,在父母classe中,我做了Getter getFqcn()
,如下所示:
abstract class BaseEntity {
/**
* Get fqcn
*
* Fully Qualified Class Name
*
* @return string
*/
public static function getFqcn()
{
return get_called_class();
}
// ...
}
使用Late静态绑定功能,并在具体对象(News
或Page
)上提供完整的类名。
我确实放了抽象,以确保不实例化。
我还在具体类中添加了一些常量:
class News extends Page {
const HUMAN_READABLE = "News";
const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation.
}
这样,我的Repository
我只能在其中一种类型上创建专门的查找器。