具有异国情调联接的Doctrine 2 paginator抛出错误

时间:2014-12-23 09:29:51

标签: php join doctrine-orm pagination

我遇到了学说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分支。

1 个答案:

答案 0 :(得分:2)

在没有更改/扩展WhereInWalker类的情况下,没有使用异常连接的解决方案。 修复现在在Doctrine 2.5.0-alpha2中,现在已经发布,所以如果你愿意的话你可以升级到它。 2.5计划在下个月发布,所以你可以等到那时候如果你愿意的话。

如果您希望保持现有的Doctrine安装,那么更改WhereInWalker和相关类并不是非常困难。 首先,您需要复制 Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker Doctrine\ORM\Tools\Pagination\WhereInWalkerDoctrine\ORM\Tools\Pagination\CountWalker

从Doctrine master分支到您自己的代码库,并相应地更改名称空间。所以你可以使用AcmeBundle\Components\Pagination\WhereInWalker或类似的东西。

您需要创建自己的Paginator,其扩展Doctrine\ORM\Tools\Pagination\Paginator,然后从父类复制过去的函数countgetIterator。然后更新功能以使用您在上面创建的Walkers。所以在count()中你替换:

$this->appendTreeWalker($countQuery, 'Doctrine\ORM\Tools\Pagination\CountWalker');

$this->appendTreeWalker($countQuery, 'AcmeBundle\Components\Pagination\CountWalker');

对getIterator方法中的WhereInWalker和LimitSubqueryWalker执行相同操作。 一切都会好起来的。我刚刚用KnpPaginator做了类似的事情来解决同样的问题。它确实会产生一些维护问题,所以如果你更新到2.5,请务必撤消这些内容。