gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:08:30 25 4
gpt4 key购买 nike

我遇到了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com