php - 带有异国情调连接的 Doctrine 2 分页器抛出错误

标签 php join doctrine-orm pagination

我遇到了 doctrine 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);

导致错误'Cannot count query which selects two FROM components, cannot make distinction' in: Doctrine\ORM\Tools\Pagination\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 分支。

最佳答案

在不更改/扩展 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 或类似的东西。

您需要创建自己的分页器,它扩展 Doctrine\ORM\Tools\Pagination\Paginator,然后复制函数 countgetIterator 来自父类。然后更新函数以使用您在上面创建的自己的 Walker。所以在 count() 中你替换:

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

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

在 getIterator 方法中对 WhereInWalker 和 LimitSubqueryWalker 做同样的事情。 然后一切都会正常工作。我刚刚对 KnpPaginator 做了类似的事情来解决同样的问题。它确实会造成一些维护问题,因此如果您更新到 2.5,请务必撤消这些操作。

关于php - 带有异国情调连接的 Doctrine 2 分页器抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617522/

相关文章:

php - 两个不同的函数,一个起作用,一个调用非对象

在没有 key 的情况下加入两个相等的数据集

mysql - 具有多个嵌套选择的 LEFT JOIN

Mysql count、join、dual结合使用

javascript - 使用 php 提交表单

php - 如何从php中的android应用程序的post方法解码json数据?

mysql - 在现有 OpenCart 数据库上使用 Doctrine 和 Symfony2

php - 使用自定义 Doctrine 2 hydrator 进行依赖注入(inject)

php - 向后加入 Doctrine2

javascript - 在纯 JavaScript 中构建具有多个步骤的表单向导的最佳实践?