gpt4 book ai didi

Symfony 查询生成器连接 ON 和 WITH 区别

转载 作者:行者123 更新时间:2023-12-02 04:39:05 25 4
gpt4 key购买 nike

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

例如,这是我的加入代码:

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

它工作得很好,但如果我把 ON 而不是 WITH ,我会收到以下错误:

[Syntax Error] line 0, col 200: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'

为什么?我看到对象中同时存在T_ON和T_WITH之类的连接子句,但是它们的用法有何区别?它们的用途是什么?

最佳答案

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

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

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

(或类似的东西)

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

// 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。如果您需要类似的东西,那么几乎可以肯定您搞砸了其他东西。

关于Symfony 查询生成器连接 ON 和 WITH 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com