在 Doctrine 中使用继承时查询派生类型的属性
Querying a derived type's attributes when using inheritance in Doctrine
使用 Doctrine 的 QueryBuilder
,当使用单个 table 继承时,如何在派生类型的属性之一上指定 where 条件。
假设我有一个类型 AbstractBillingEntity
,它有一个派生类型 ComplexBiller
。 ComplexBiller
本身有一个受保护的 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'
)
使用 Doctrine 的 QueryBuilder
,当使用单个 table 继承时,如何在派生类型的属性之一上指定 where 条件。
假设我有一个类型 AbstractBillingEntity
,它有一个派生类型 ComplexBiller
。 ComplexBiller
本身有一个受保护的 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'
)