选择使用doctrine 2从一个超类扩展的多个子类的实体

时间:2012-03-06 10:19:47

标签: php doctrine-orm

鉴于我的Doctrine 2实体的这种设置:

App\Bundle\LorumBundle\Entity\Node:
  type: entity
  table: node
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY

    created:
      type: datetime

  inheritanceType: SINGLE_TABLE

  discriminatorColumn:
    name: type
    type:  string
    length: 255
  discriminatorMap:
    a: a
    b: b
    c: c

App\Bundle\LorumBundle\Entity\A:
  type: entity

  fields:
    status:
      type: boolean

App\Bundle\LorumBundle\Entity\B:
  type: entity

  fields:
    status:
      type: boolean

App\Bundle\LorumBundle\Entity\C:
  type: entity

  fields:
    title:
      type: string

现在我想得到的基本上是A&类型实体的混合列表。 B(不是C)与status == true

我可以像这样编写一个查询 - 使用instance of运算符将结果限制为我想要的子类,但是我会得到一个错误,因为我想要匹配的属性(状态)没有映射在超级类别中,我想要匹配的所有实体都很难拥有它:

$queryBuilder->select('Node');
$queryBuilder->from('App\Bundle\LorumBundle\Entity\Node','Node');
$queryBuilder->add('where',$queryBuilder->expr()->orx(
        'Offer INSTANCE OF AppLorumBundle:A',
        'Offer INSTANCE OF AppLorumBundle:B'
));
$queryBuilder->where($queryBuilder->expr()->eq('Node.status', '?1'));
$queryBuilder->setParameter(1, true);
$queryBuilder->orderBy('Node.created', 'asc');
$queryBuilder->setFirstResult( 0 );
$queryBuilder->setMaxResults( 200 );

有没有办法做到这一点,没有写自己的持久性并将其破解为Doctrine2?

不幸的是,对于我来说,只是将信息添加到超类中并不是一个选项(在我的实际场景中,这种情况主要适用于我不希望每个子类都急切加载的关系)

1 个答案:

答案 0 :(得分:1)

您可以使用UNION并处理实体A和B的查询

  • 为实体A构建查询
  • 构建实体B的查询
  • 使用UNION为查询A和B构建限制和订单查询

不需要为Doctrine库做任何黑客攻击