鉴于我的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?
不幸的是,对于我来说,只是将信息添加到超类中并不是一个选项(在我的实际场景中,这种情况主要适用于我不希望每个子类都急切加载的关系)
答案 0 :(得分:1)
您可以使用UNION并处理实体A和B的查询
不需要为Doctrine库做任何黑客攻击