在 Doctrine 中使用继承时查询派生类型的属性
Posted
技术标签:
【中文标题】在 Doctrine 中使用继承时查询派生类型的属性【英文标题】:Querying a derived type's attributes when using inheritance in Doctrine 【发布时间】:2015-07-05 07:43:42 【问题描述】:使用 Doctrine 的 QueryBuilder
,如何在使用单表继承时在派生类型的属性之一上指定 where 条件。
假设我有一个类型AbstractBillingEntity
,它有一个派生类型ComplexBiller
。 ComplexBiller
本身有一个受保护的 Doctrine 控制属性,称为 organisationCode
。
如何使用QueryBuilder
搜索所有ComplexBiller
类型且具有ComplexBiller.organisationCode > 5
的计费实体?
$queryBuilder->andWhere("billingEntity INSTANCE OF ComplexBiller")
$queryBuilder->andWhere(??)
使用 Doctrine 2.4、php 5.6
【问题讨论】:
【参考方案1】:事实证明这是 Doctrine 团队目前无法解决的老问题 (DCC-16)
显然,Doctrine DQL 语言的内部结构使得尝试和实现一种强制转换形式变得非常费力。虽然将来可能会考虑,但练习是执行一个对子类有明确要求的子查询:
$subExpr = $this->em->createQueryBuilder()
->select("anEntity")
->from("ChildClass", "anEntity")
->where("orgEntity.derivedTypeAttr = :someParam");
$mainExpr = $this->em->createQueryBuilder()
->where($queryBuilder->expr()->in("billingEntity.id", $subExpr->getDQL()))
->setParameter("someParam", $myVal);
或者,在原生 SQL 中(取自非常有用的源 here)
SELECT
a
FROM
Entities\Auction a
INNER JOIN
a.item i
INNER JOIN
i.bookTypes b
WHERE
i.id IN (
SELECT
b.id
FROM
Entities\Book b
WHERE
b.type = 'Fantasy'
)
【讨论】:
以上是关于在 Doctrine 中使用继承时查询派生类型的属性的主要内容,如果未能解决你的问题,请参考以下文章