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

Querying a derived type's attributes when using inheritance in Doctrine

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

假设我有一个类型 AbstractBillingEntity,它有一个派生类型 ComplexBillerComplexBiller 本身有一个受保护的 Doctrine 控制属性,称为 organisationCode

如何使用 QueryBuilder 搜索类型为 ComplexBiller 且具有 ComplexBiller.organisationCode > 5 的所有账单实体?

        $queryBuilder->andWhere("billingEntity INSTANCE OF ComplexBiller")
        $queryBuilder->andWhere(??)

使用学说 2.4,PHP5.6

事实证明这是一个老问题,Doctrine 团队目前不会修复 (DCC-16)

显然,Doctrine DQL 语言的内部机制使得尝试和实现一种转换形式成为一种详尽的努力。虽然将来可能会考虑,但锻炼是执行 sub-query 并明确要求 child class:

$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'
    )