Doctrine DQL:如何使表达式反转

Posted

技术标签:

【中文标题】Doctrine DQL:如何使表达式反转【英文标题】:Doctrine DQL: how to get expression to inversed side 【发布时间】:2013-08-06 03:31:16 【问题描述】:

我希望获取一个不存在反向关联的实体(在 1:1 关联上)

我得到错误:

DQL 查询不支持反向单值关联路径表达式。使用 而是显式加入。

查询:

$query = $this->getEntityManager()->createQuery("
                SELECT DISTINCT(p.date)
                FROM MainBundle:Price p
                WHERE p.emaPrice IS NULL
                ORDER BY p.date ASC
            ")
            ->setMaxResults(1);
        $date = $query->getOneOrNullResult();

我理解这个错误,但我真的坚持要修复它。我读过我应该添加一个明确的 JOIN,但我已经添加了它,但仍然没有运气。

编辑 使用连接查询:

$query = $this->getEntityManager()->createQuery("
        SELECT DISTINCT(p.date)
        FROM MainBundle:Price p
        JOIN MomentumBundle:EmaPrice ep
        WITH ep.id = p.emaPrice
        WHERE p.emaPrice IS NULL
        ORDER BY p.date ASC
    ")
    ->setMaxResults(1);
$date = $query->getOneOrNullResult();

【问题讨论】:

您的查询在加入后看起来如何? @Flip 添加连接查询 你能让它在原生 SQL 中工作吗? 我对您的查询感到困惑。你加入ep.id = p.emaPrice,然后加入WHERE p.emaPrice IS NULL。即使查询有效,它也永远不会匹配任何内容。 在这种情况下需要左连接 【参考方案1】:

感谢@Flip 和@lifo 的大力支持,帮助我解决了这个问题:

$query = $this->getEntityManager()->createQuery("
        SELECT DISTINCT(p.date)
        FROM MainBundle:Price p
        LEFT JOIN MomentumBundle:EmaPrice ep
        WITH ep.price = p.id
        WHERE ep IS NULL
        ORDER BY p.date ASC
    ")
    ->setMaxResults(1);
$date = $query->getOneOrNullResult();

【讨论】:

以上是关于Doctrine DQL:如何使表达式反转的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine ODM 中的 AND 和 OR 表达式

如何在 Doctrine 2 DQL 中使用 now()?

如何在 Doctrine 2 DQL 中使用 DATE()?

如何删除学说 Doctrine Raw Sql 查询中的特定 dql 部分?

如何在 SQL Server 的 Doctrine 2 中更改 DQL 查询中的 LockMode

c_cpp 使表达式平衡所需的最小括号反转次数