php - Doctrine 2 DQL - 如何选择单向多对多查询的反面?

标签 php doctrine dql

我有两个类 - Page 和 SiteVersion,它们具有多对多关系。只有 SiteVersion 知道这种关系(因为该站点是模块化的,我希望能够带走并放入 SiteVersion 所属的模块)。

因此,我将如何根据 SiteVersion 标准选择页面?

例如,这不起作用:

SELECT p FROM SiteVersion v JOIN v.pages p WHERE v.id = 5 AND p.slug='index'

我得到错误:

[Doctrine\ORM\Query\QueryException]
[Semantical Error] line 0, col -1 near 'SELECT p FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

即使我可以通过此查询选择“v”。

我想我可以通过为关系引入一个类(PageToVersion 类)来解决这个问题,但是有没有办法不这样做,或者让它成为双向的?

最佳答案

在 Doctrine ORM 中有两种处理方法。最典型的是使用带有子查询的 IN 条件:

SELECT
    p
FROM
    SitePage p
WHERE
    p.id IN(
        SELECT
            p2.id
        FROM
            SiteVersion v
        JOIN
            v.pages p2
        WHERE
            v.id = :versionId
            AND
            p.slug = :slug
    )

另一种方法是与 arbitrary join functionality introduced in version 2.3 of the ORM 进行额外的连接。 :

SELECT
    p
FROM
    SitePage p
JOIN
    SiteVersion v
WITH
    1 = 1
JOIN
    v.pages p2
WHERE
    p.id = p2.id
    AND
    v.id = :versionId
    AND
    p2.slug = :slug

1 = 1 只是因为解析器的当前限制。

请注意the limitation that causes the semantical error是因为水合过程从所选实体的根部开始。如果没有根,水龙头就没有关于如何折叠的引用 fetch-joined或加入结果。

关于php - Doctrine 2 DQL - 如何选择单向多对多查询的反面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5432404/

相关文章:

php - 为 get_browser() 设置 $_SERVER ['HTTP_USER_AGENT' ]

php - 您会为新的 Facebook 应用程序选择哪种 PHP 框架,为什么?

php - pecl install apc 不工作。 shtool 不存在

phpmyadmin - 我的代码不会创建表

mysql - 在 DQL 中加入并计数

php - Symfony4 - 'app/config/config.yml' 丢失了吗?

php - Symfony getter 和 setter 生成 - 如何忽略属性

dql - documentum DQL 命令 exec count_sessions - 列 "hot_list_size"、 "warm_list_size","cold_list_size"是什么意思?

sql - Symfony2 + Doctrine - 过滤

symfony - DQL - 从日期时间格式中提取年份