Doctrine 2 - 类表继承,按类型选择

时间:2011-02-19 22:26:13

标签: php doctrine-orm

我有两个实体 - 新闻和页面。 定义如下:

/**
 * 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类?或者我是否必须为此创建一些额外的实体扩展页面?

2 个答案:

答案 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静态绑定功能,并在具体对象(NewsPage)上提供完整的类名。

我确实放了抽象,以确保不实例化。

我还在具体类中添加了一些常量:

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

}

这样,我的Repository我只能在其中一种类型上创建专门的查找器。