【问题标题】:Doctrine join WITH vs WHERE教义 join WITH vs WHERE
【发布时间】:2016-01-12 17:13:17
【问题描述】:

我正在加入多个表,我找到了两个解决方案。我无法弄清楚有什么区别。谁能告诉我?

解决方案 1:

$query = $entityManager->createQuery("
    SELECT m FROM Model m
        JOIN m.battery b
        JOIN m.camera c
        JOIN m.connectivity co
        JOIN m.hardware h
        JOIN m.screen s
        JOIN m.sensor se                                                        
            WHERE b = m.battery
            AND c = m.camera
            AND co = m.connectivity
            AND h = m.hardware
            AND s = m.screen
            AND se = m.sensor"
);

解决方案 2:

$query = $entityManager->createQuery("
    SELECT m FROM Model m
        JOIN m.battery b
        WITH m.battery = b
        JOIN m.camera c
        WITH m.camera = c
        JOIN m.connectivity co
        WITH m.connectivity = co
        JOIN m.hardware h
        WITH m.hardware = h
        JOIN m.screen s
        WITH m.screen = s
        JOIN m.sensor se
        WITH m.sensor = se
");

【问题讨论】:

    标签: join doctrine-orm dql doctrine-query


    【解决方案1】:

    你写的是DQL,你不应该把它和SQL混淆。在 DQL 查询连接中,您不需要将 id 字段显式添加到连接中,Doctrine 会为您处理。

    "SELECT m FROM Model m JOIN m.battery b" 就足够了。

    fetch-joinb 添加到您的选择子句中:

    "SELECT m, b FROM Model m JOIN m.battery b"

    如果您只想加入具有特定属性的电池,即您需要在DQL 中使用WITH 子句。例如只加入电池statusempty 的电池:

    "SELECT m, b FROM Model m JOIN m.battery b WITH b.status = 'empty'"

    查看the documentation on DQL joins了解更多信息。

    【讨论】:

      【解决方案2】:

      根据我的阅读,我可以说:

      当您在join中使用Where而不是On时,有一个区别,On将在选择之前应用,Where将在连接选择过程之后应用。
      WITH类似到On 子句,它允许您指定除On 之外的另一个条件。 所以我认为当你使用With时,它会像ON一样工作,但Where会在Join选择后消除结果。
      它可能会有所帮助:Stack Overflow

      this问题的Selected Answer也使用了其中的两个和解释。

      【讨论】:

      • @RobinDijkhof 在内部联接中,是的,但在外部联接中无关紧要。
      • @RobinDijkhof 我想我错了。查询优化器将为连接选择最佳方式,它们可以互换使用。阅读此stackoverflow.com/questions/354070/…
      • @RobinDijkhof WHERE 子句过滤 JOIN 的左侧和右侧,而 ON 子句将始终仅过滤右侧。 - 如果您总是想获取左侧行并且仅在某些条件匹配时才加入,那么您应该使用 ON 子句。 - 如果你想在 JOIN 之后过滤两边,那么你应该使用 WHERE 子句。
      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2021-09-22
      • 2017-03-20
      相关资源
      最近更新 更多