php - Doctrine DQL、类表继承和访问子类字段

标签 php inheritance doctrine-orm doctrine dql

我对 DQL 查询和实体特化有疑问。

我有一个名为 Auction 的实体,它是与 ItemOneToOne 关系。 ItemFilmBookmappedSuperclass。我需要一个可以支持搜索引擎的查询,允许用户查找具有不同属性的拍卖 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 named bookTypes

Book 为假,Item 为真。

我也试过了

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

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

如果这很重要,我正在使用类表继承。不过,我不认为切换到单表继承可以解决问题。

有什么想法吗?

最佳答案

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

问题在于, Doctrine 的 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 非常不同,遵循不同的规则。

关于php - Doctrine DQL、类表继承和访问子类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496621/

相关文章:

php - 如何在PHP中实现Countable接口(interface)?

php - 表格中未显示图片

c++ - C++ 中的指针数组

php - Doctrine transactions - 计算未决请求的数量

php - 学说查询生成器 : how to do a query with inner joins conditions

php - 如何将 PHP 变量从一个函数传递到另一个函数?

php - 替换 notFoundHandler 设置

Java - 调用方法时的继承和变量类型

ios - 如何让一个自定义类继承自多个父类(super class)?

mysql - 如何在 Symfony 2.0 中使用 Linux Xampp mysql_pdo