【问题标题】:Is it possible to convert into DQL or Doctrine Query Builder是否可以转换为 DQL 或 Doctrine Query Builder
【发布时间】:2013-04-02 12:16:48
【问题描述】:

我有 3 个带列的表

A:
    id
B:
    id
    a_id
C:
    id
    b.id

使用原生查询:

SELECT a.id, b.id, c.id
FROM A as a 
LEFT JOIN B as b 
    INNER JOIN C as c ON b.id = c.b_id
ON a.id = b.a_id

我试过了

SELECT a.id, b.id, c.id 
    FROM App\HomeBundle\Entity\A as a
    LEFT JOIN App\HomeBundle\Entity\B as b
        INNER JOIN App\HomeBundle\Entity\C as c
        ON c.id = c.bId
    ON a.id = b.aId

我遇到了错误:

Error: Expected Literal, got 'JOIN' 

是否可以将我的本机查询转换为 DQL 或查询生成器?如果可能,它会是什么样子?

【问题讨论】:

  • 尝试将最后一个ON 子句移到LEFT JOIN 子句之后的适当位置。正如所写,它看起来语法不正确。
  • 是的,我已经尝试过了。但与原生查询相比,我得到了不同的结果。
  • 根据groups.google.com/forum/#!topic/doctrine-user/0rNbXlD0E_8,我认为用 Doctrine 做这个查询是不可能的。

标签: doctrine-orm doctrine query-builder


【解决方案1】:

这只是一个猜测,但对于评论来说太长了。如果我完全不在基地,我会删除这个答案。

假设您的本机查询在语法上是正确的,也许 MySQL 将最后一个 ON 条件应用于 bc 之间的 INNER JOIN 的结果。如果这是真的,看看这是否会给你同样的结果:

SELECT a.id, b.id, c.id 
FROM App\HomeBundle\Entity\A as a
LEFT JOIN (
    SELECT bx.aID
    FROM   App\HomeBundle\Entity\B as bx
    INNER JOIN App\HomeBundle\Entity\C as c
    ON    bx.id = c.bId
    ) b
ON a.id = b.aId

请注意,我更正了我认为您尝试的解决方案中的错误(您所说的 ON c.id = c.bId)。

【讨论】:

  • 我运气不好,我试试你的解决方案。它适用于本机 SQL,但在 DQL 上没有运气。我得到一个错误:错误:类'('未定义。正好在“LEFT JOIN(”之后。我认为教义连接表达式不了解什么子查询,因此它像类/实体一样处理。
  • 哦,对不起。正如我所说,这只是一个猜测。我不懂教义。您可能想要删除 MySQL 标记并澄清您的问题,因此很明显您的问题仅与教义有关。无论如何我都会留下这个答案;可能会帮助其他人提供真正的解决方案。
  • mysql 标签已移除。谢谢你的帮助。我很感激。 :D
  • 我也尝试过加入 select 语句的结果,但它在 DQL 中不起作用。我相信这是因为 DQL 是一种 entity 查询语言,用于与彼此相关的实体进行交互,并且不允许使用临时表等的原始查询。请参阅我的相关问题:@987654321 @
【解决方案2】:

这是一个较老的问题,但我相信您需要加入关系,而不是实体。

例如,代替

SELECT a
    FROM Entity\A as a
    LEFT JOIN Entity\B as b

应该是:

SELECT a
    FROM Entity\A as a
    LEFT JOIN a.entityB as b

如果不清楚,a.entityB 是 A 实体的属性,称为“entityB”。该属性定义了 A 和 B 之间的关系。

当您只是将实体连接到实体时,Doctrine 不知道它们是如何相关的。但是,如果你基于属性进行 JOIN,Doctrine 可以使用注解(或其他映射)来确定 A 和 B 的关系。

【讨论】:

  • 也许我对您的答案的解释是错误的。但是,如何查询一个与自身属性相连的实体呢?抱歉,回复晚了。
【解决方案3】:

在使用教义时,我总是不得不使用 WITH 关键字而不是 ON

【讨论】:

  • 给我更详细的解释。
  • 除了 DQL 似乎使用 WITH 关键字而不是 ON 之外,我对此了解不多。在 MySQL 中我会使用 ON 在 DQL 中我使用 WITH
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 2015-04-02
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多