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

Han*_*nes 5 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
Run Code Online (Sandbox Code Playgroud)

现在我想得到的基本上是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 );
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,它不是我的选择,只是将信息添加到超类(在我的真实场景中,这种情况主要适用于我不希望每个子类急切加载的关系)

Wiz*_*rdZ 1

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

  • 为实体 A 构建查询
  • 为实体 B 构建查询
  • 使用 UNION 为查询 A 和 B 构建限制和顺序查询

无需对 Doctrine 库进行任何修改