【问题标题】:Querying a derived type's attributes when using inheritance in Doctrine在 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

【问题讨论】:

    标签: php orm doctrine-orm query-builder


    【解决方案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'
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多