原则 DQL、类表继承和对子类字段的访问

2022-08-30 20:03:40

我在 DQL 查询和实体特化方面遇到了问题。

我有一个名为 的实体,它与 关系。 是 for 和 。我需要一个可以支持搜索引擎的查询,允许用户查找具有不同属性的拍卖,这些拍卖销售具有不同属性的物品(这是使其具有挑战性的部分)。AuctionOneToOneItemItemmappedSuperclassFilmBookANDAND

问题是,即使有一个指向这样的关联,我也需要访问 - 和 - 特定的字段。用户将指定他们要查找的类型,但除了在我的 DQL 查询中使用之外,我没有看到任何其他使用此信息的方法。AuctionItemFilmBookItemINSTANCE 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 ...". 

此类查询会导致错误,指出:

类没有名为Entities\ItembookTypes

对于 为假,但对于 为真。BookItem

我也试过

SELECT a FROM Entities\Book i 
    INNER JOIN i.auction a ...

但我认为教义要求我在和陈述中引用同一个实体。SELECTFROM

如果这很重要,我正在使用类表继承。不过,我不认为切换到单个表继承会起作用。

有什么想法吗?


答案 1

正如Matt所说,这是一个老问题,Doctrine Project不会解决(DDC-16)。

问题在于,学说的DQL是一种静态类型的语言,其内部具有一定程度的复杂性。

我们考虑过允许向上转换几次,但是让它工作的努力根本不值得,人们会简单地滥用语法做非常危险的事情。

如 DDC-16 中所述,确实也无法在不引起令人讨厌的问题(例如多个子类使用不同的列名定义相同的属性)的情况下了解该属性属于哪个类。

如果要筛选 CTI 或 JTI 中子类中的数据,可以使用我在 https://stackoverflow.com/a/14854067/347063 中描述的技术。这会将您的 DQL 与所有相关的子类耦合。

在您的案例中,您最需要的 DQL 很可能是(假设它是 的子类):Entities\BookEntities\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非常不同,并且遵循不同的规则。


答案 2

更新:

我发现了一个解决方案。请参阅我对此相关问题的答案:

学说2:多态查询:搜索子类的属性


推荐