Doctrine DQL,类表继承和对子类字段的访问

cri*_*zis 18 php inheritance doctrine dql doctrine-orm

我有一个DQL查询和实体专业化的问题.

我有一个叫做的实体Auction,它OneToOne与之有关系Item.ItemmappedSuperclassFilmBook.我需要一个可以支持搜索引擎的查询,允许用户查找具有不同属性的拍卖,AND销售具有不同属性的项目(这是AND使其具有挑战性的部分).

问题是即使Auction有一个指向Item这样的关联,我需要访问Film- 和Book- 特定的字段.用户将指定Item他们正在寻找的类型,但除了INSTANCE OF在我的DQL查询中使用之外,我没有看到任何使用此信息的方法.

到目前为止,我已尝试使用如下查询:

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 ...". 
Run Code Online (Sandbox Code Playgroud)

这样的查询会导致错误说:

Entities\Item没有命名的字段或关联bookTypes

这是假的Book,但却是如此Item.

我也试过了

SELECT a FROM Entities\Book i 
    INNER JOIN i.auction a ...
Run Code Online (Sandbox Code Playgroud)

但我认为Doctrine要求我引用相同的实体SELECTFROM语句.

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

有任何想法吗?

Ocr*_*ius 10

正如Matt所说,这是Doctrine Project无法解决的老问题(DDC-16).

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

我们考虑过几次允许向上转换,但是努力实现这项工作根本不值得,人们只会滥用语法做非常危险的事情.

正如DDC-16所述,确实不可能理解属性属于哪个类而不会产生令人讨厌的问题,例如多个子类定义具有不同列名的相同属性.

如果要在CTI或JTI中过滤子类中的数据,可以使用我在/sf/answers/1039784721/中描述的技术.这将您的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'
    )
Run Code Online (Sandbox Code Playgroud)

这是你的问题的伪代码.这并不好,但请记住,SQL和DQL是非常不同的,并遵循不同的规则.