40

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

例如这是我的加入代码:

->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 子句,但它们的用法有什么区别?它们的用途是什么?

4

2 回答 2

63

@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() ;
}

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

于 2013-07-02T14:44:34.607 回答
8

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

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

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

并且学说 2 将正确处理连接。

这是一个相关的问题:我可以在 DQL 中使用“ON”关键字还是需要使用本机查询?

于 2013-07-02T11:51:01.090 回答