Symfony2 QueryBuilder在和上使用差异进行连接

Symfony2 QueryBuilder在和上使用差异进行连接,symfony,doctrine-orm,left-join,query-builder,Symfony,Doctrine Orm,Left Join,Query Builder,我是Symfony2的新手,我通过QueryBuilder和Doctrine 2成功构建了我的第一个加入。 也许这是一个愚蠢的问题,但无论是在网上还是在Symfony2的方法中,我都找不到任何东西来理解连接子句“WITH”和“on”之间的区别 例如,这是我的加入代码: ->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)') 它工作得很好,但

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

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

->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)')
它工作得很好,但如果我将
置于
上,而不是将
置于
上,则会出现以下错误:

[语法错误]第0行,第200列:错误:应为 条令\ORM\Query\Lexer::T_WITH,got'ON'


为什么??在这些对象中,我已经看到了T_ON和T_都有like join子句,但是它们的用法区别是什么?它们的用途是什么?

理论上,ON允许您提供完整的连接标准,而允许您向默认标准添加其他标准(IMHO)

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

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

doctrine2将正确处理连接


这里有一个相关的问题:

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

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

SELECT * FROM category
    LEFT JOIN product ON product.category_id = category.id
(或类似的事情)

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

// CategoryRepository.php
public function getCategoriesAndJoinProducts() 
{
    return $this->createQueryBuilder("o")
        ->leftJoin("o.products", "p")->addSelect("p") 
        ->getQuery()->getResult() ;
}
两者都将获取所有类别并加入与之关联的产品

现在是带有
子句的
。如果您只想加入价格大于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() ;
}

所以,在现实中,如果你使用的是教义,你永远不应该在
上使用
。如果你需要这样的东西,你几乎可以肯定你搞砸了别的东西。

非常感谢你的评论。我已经看过那篇文章了,我的问题是它不能满足我的问题,因为那里写的只是解决方案,而不是“WITH”而不是“OR”的原因,以及它们之间的差异。那么结果呢?它是否返回关联的实体\模型?例如,我不能在聚会上晚一点得到合适的方法,但是join查询方法应该放在哪里呢??在上面的示例中,您在
CategoryRepository.php
中创建了查询方法,为什么不在
ProductRepository.php
中创建呢?这根本不是一个愚蠢的问题。这是条令文件的主要问题。没有参考资料,只有一份参考指南,其中没有涵盖这一点和许多其他不明确之处。