我遇到了学说2分页符的问题。我做了一个非常基本的例子来解释这种情况:
$queryBuilder->select('entity');
$queryBuilder->join('SomeModule\Entity\SomeEntity', 's', 'WITH', '(s.objectClass = :class AND p.foreignKey = :foreignkey');
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($queryBuilder);
导致错误'无法计数选择两个FROM组件的查询,无法区分': 教义\ ORM \工具\分页\ WhereInWalker
这样做是因为有两个组件,但在这种情况下,没有从'SomeModule \ Entity \ SomeEntity'中选择任何列:
if (count($rootComponents) > 1) {
throw new \RuntimeException("Cannot count query which selects two FROM components, cannot make distinction");
}
在我的情况下,它在我评论异常时起作用,因为它只会使用第一个$ rootComponent。有没有人知道这种异域连接的解决方案,而不更改/扩展WhereInWalker类?
当我使用master分支时,我使用了ORM的2.4.6版本: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Pagination/WhereInWalker.php 问题得到解决。但我宁愿不在我们的环境中使用master分支。
答案 0 :(得分:2)
在没有更改/扩展WhereInWalker类的情况下,没有使用异常连接的解决方案。 修复现在在Doctrine 2.5.0-alpha2中,现在已经发布,所以如果你愿意的话你可以升级到它。 2.5计划在下个月发布,所以你可以等到那时候如果你愿意的话。
如果您希望保持现有的Doctrine安装,那么更改WhereInWalker和相关类并不是非常困难。
首先,您需要复制
Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker
Doctrine\ORM\Tools\Pagination\WhereInWalker
和Doctrine\ORM\Tools\Pagination\CountWalker
从Doctrine master分支到您自己的代码库,并相应地更改名称空间。所以你可以使用AcmeBundle\Components\Pagination\WhereInWalker
或类似的东西。
您需要创建自己的Paginator,其扩展Doctrine\ORM\Tools\Pagination\Paginator
,然后从父类复制过去的函数count
和getIterator
。然后更新功能以使用您在上面创建的Walkers。所以在count()中你替换:
$this->appendTreeWalker($countQuery, 'Doctrine\ORM\Tools\Pagination\CountWalker');
与
$this->appendTreeWalker($countQuery, 'AcmeBundle\Components\Pagination\CountWalker');
对getIterator方法中的WhereInWalker和LimitSubqueryWalker执行相同操作。 一切都会好起来的。我刚刚用KnpPaginator做了类似的事情来解决同样的问题。它确实会产生一些维护问题,所以如果你更新到2.5,请务必撤消这些内容。