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 添加的字段分配值?
Symfony2 表单 > 实体字段类型 > 查询构建器 > 可能的子选择?
Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()