在 Doctrine 中使用继承时查询派生类型的属性

Posted

技术标签:

【中文标题】在 Doctrine 中使用继承时查询派生类型的属性【英文标题】:Querying a derived type's attributes when using inheritance in Doctrine 【发布时间】:2015-07-05 07:43:42 【问题描述】:

使用 Doctrine 的 QueryBuilder,如何在使用单表继承时在派生类型的属性之一上指定 where 条件。

假设我有一个类型AbstractBillingEntity,它有一个派生类型ComplexBillerComplexBiller 本身有一个受保护的 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 中使用继承时查询派生类型的属性的主要内容,如果未能解决你的问题,请参考以下文章

PHP Doctrine 使用鉴别器映射查询继承的类

Doctrine2 - 继承映射,查询子类

如何更改 Doctrine2 CTI 继承中的实体类型

C++ 容器与继承

同一架构中的不同继承类型

继承中的基类是不是复制到派生类?