Symfony2 QueryBuilder在和上使用差异进行连接
我是Symfony2的新手,我通过QueryBuilder和Doctrine 2成功构建了我的第一个加入。 也许这是一个愚蠢的问题,但无论是在网上还是在Symfony2的方法中,我都找不到任何东西来理解连接子句“WITH”和“on”之间的区别 例如,这是我的加入代码: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)') 它工作得很好,但
->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
中创建呢?这根本不是一个愚蠢的问题。这是条令文件的主要问题。没有参考资料,只有一份参考指南,其中没有涵盖这一点和许多其他不明确之处。