Symfony Query Builder join ON 和 WITH 区别

Posted

技术标签:

【中文标题】Symfony Query Builder join ON 和 WITH 区别【英文标题】:Symfony2 QueryBuilder join ON and WITH difference 【发布时间】:2013-06-29 15:28:44 【问题描述】:

我是 Symfony2 的新手,我通过 QueryBuilder 和 Doctrine 2 成功构建了我的第一个连接。 可能这是一个愚蠢的问题,但无论是在线还是在 Symfony2 的方法中,我都找不到任何东西来理解连接子句“WITH”和“ON”之间的区别。

例如这是我的加入代码:

->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)')

效果很好,但如果我输入 ON 而不是 WITH 我会收到以下错误:

[语法错误] 第 0 行,第 200 列:错误:预期 Doctrine\ORM\Query\Lexer::T_WITH,得到了'ON'

为什么?我在对象中看到有 T_ON 和 T_WITH like join 子句,但它们的用法有什么区别?它们的用途是什么?

【问题讨论】:

根本不是一个愚蠢的问题。这是 Doctrine 文档的主要问题。没有参考,只有参考指南,不涵盖这一点和许多其他不明确之处。 【参考方案1】:

@florian 给了你正确的答案,但让我试着用例子来解释一下:

在 sql 中,连接是这样完成的:

SELECT * FROM category
    LEFT JOIN product ON product.category_id = category.id

(或类似的东西)

现在在 Doctrine 中,您不需要使用 ON 子句,因为教义从实体中的关系注释中知道这一点。所以上面的例子是:

// CategoryRepository.php
public function getCategoriesAndJoinProducts() 

    return $this->createQueryBuilder("o")
        ->leftJoin("o.products", "p")->addSelect("p") 
        ->getQuery()->getResult() ;

两者都将获取所有类别并加入与其关联的产品。

现在是WITH 子句。如果您只想加入价格大于 50 的产品,您可以在 SQL 中执行此操作:

SELECT * FROM category
    LEFT JOIN product ON product.category_id = category.id AND product.price>50

在教义上:

// CategoryRepository.php
public function getCategoriesAndJoinProductsWithPriceBiggerThan($price) 

    return $this->createQueryBuilder("o")
        ->leftJoin("o.products", "p", "WITH", "p.price>:price")
            ->setParameter("price", price)->addSelect("p") 
        ->getQuery()->getResult() ;

因此,实际上,如果您使用 Doctrine,则永远不应该使用 ON。如果你需要这样的东西,你几乎可以肯定你搞砸了别的东西。

【讨论】:

结果呢?它返回关联的实体\模型吗?例如我找不到合适的***.com/questions/20134014/… 聚会有点晚了,但是join查询方法应该放在哪里合适呢??在上面的示例中,您在 CategoryRepository.php 中创建了查询方法,为什么不在 ProductRepository.php 中创建??【参考方案2】:

理论上,ON 允许您提供完整的连接条件,而 WITH 允许将附加条件添加到默认条件(恕我直言)。

但是,DQL 允许的是避免给出 JOIN 标准:

你只需要说:$qb->leftJoin('prod.pdata', 'pdata');

doctrine2 将正确处理连接。

这是一个相关的问题:Can I use "ON" keyword in DQL or do I need to use Native Query?

【讨论】:

非常感谢您的评论。我已经看过那篇帖子,我的问题是它不能满足我的问题,因为那里只写了解决方案,但没有写“WITH”而不是“OR”的原因及其差异。

以上是关于Symfony Query Builder join ON 和 WITH 区别的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Query Builder 如何获取最后分组的记录

Symfony 表单 query_buider 和实体存储库

是否可以为 $builder symfony 中使用 EventListener symfony 添加的字段分配值?

仅允许 Joi 模式中键的特定值

Symfony2 表单 > 实体字段类型 > 查询构建器 > 可能的子选择?

Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()