【问题标题】:Doctrine 2 paginator with exotic join throws error具有异域连接的 Doctrine 2 分页器抛出错误
【发布时间】:2015-02-21 10:16:10
【问题描述】:

我遇到了教义 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 组件的查询,无法区分”: 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 分支。

【问题讨论】:

    标签: php join doctrine-orm pagination


    【解决方案1】:

    在不更改/扩展 WhereInWalker 类的情况下,没有使用外来连接的解决方案。 该修复程序现在在现已发布的 Doctrine 2.5.0-alpha2 中,因此您可以根据需要升级到该版本。 2.5 计划于下个月发布,因此如果您愿意,可以等到那时。

    如果您想保持现有的 Doctrine 安装不变,那么更改 WhereInWalker 和相关类并不是非常困难。 首先你需要复制 Doctrine\ORM\Tools\Pagination\LimitSubqueryWalkerDoctrine\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,请务必撤消这些操作。

    【讨论】:

    • 我们通过分支 2.4 版本并对 WhereInWalker 应用一些更改来修复它
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多