鉴于我的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?
不幸的是,它不是我的选择,只是将信息添加到超类(在我的真实场景中,这种情况主要适用于我不希望每个子类急切加载的关系)
您可以使用 UNION 并处理实体 A 和 B 的查询
无需对 Doctrine 库进行任何修改
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |