我对 DQL 查询和实体特化有疑问。
我有一个名为 Auction
的实体,它是与 Item
的 OneToOne
关系。 Item
是 Film
和 Book
的 mappedSuperclass
。我需要一个可以支持搜索引擎的查询,允许用户查找具有不同属性的拍卖 AND
出售具有不同属性的元素(正是 AND
部分使它具有挑战性的)。
问题是,即使 Auction
有一个指向 Item
的关联,我也需要访问 Film
- 和 Book
特定字段。用户将指定他们正在寻找的 Item
类型,但除了在我的 DQL 查询中使用 INSTANCE OF
之外,我没有看到任何使用此信息的方法。
到目前为止,我已经尝试过使用如下查询:
SELECT a FROM Entities\Auction a
INNER JOIN a.item i
INNER JOIN i.bookTypes b
WHERE i INSTANCE OF Entities\Book
AND b.type = 'Fantasy'
AND ...".
这样的查询会导致错误提示:
Class
Entities\Item
has no field or association namedbookTypes
Book
为假,Item
为真。
我也试过了
SELECT a FROM Entities\Book i
INNER JOIN i.auction a ...
但我认为 Doctrine 要求我在 SELECT
和 FROM
语句中引用相同的实体。
如果这很重要,我正在使用类表继承。不过,我不认为切换到单表继承可以解决问题。
有什么想法吗?
最佳答案
正如马特所说,这是 Doctrine Project 无法解决的老问题 (DDC-16)。
问题在于, Doctrine 的 DQL 是一种静态类型语言,其内部具有一定的复杂性。
我们曾考虑过允许向上转换几次,但努力实现这一目标根本不值得,人们只会滥用语法做非常危险的事情。
正如 DDC-16 中所述,实际上也无法理解属性属于哪个类,而不会招致令人讨厌的问题,例如多个子类定义具有不同列名的相同属性。
如果您想过滤 CTI 或 JTI 的子类中的数据,您可以使用我在 https://stackoverflow.com/a/14854067/347063 中描述的技术。 .这会将您的 DQL 与所有涉及的子类结合起来。
您最需要的 DQL 很可能是(假设 Entities\Book
是 Entities\Item
的子类):
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'
)
这是您问题的伪代码。这不好,但请记住,SQL 和 DQL 非常不同,遵循不同的规则。
关于php - Doctrine DQL、类表继承和访问子类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496621/