knp 分页器仅适用于数组
Posted
技术标签:
【中文标题】knp 分页器仅适用于数组【英文标题】:knp paginator only works with array 【发布时间】:2013-02-22 03:19:10 【问题描述】:我在 Symfony 2 中使用 Knp Paginator Bundle。
尝试将 Doctrine 查询传递给分页器时,我不断收到以下错误:
Fatal error: Call to a member function toArray() on a non-object in /var/www/adwind/vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Paginate/Doctrine/ORM/QuerySubscriber.php on line 67 Call Stack: 0.0000 635448 1. main() /var/www/adwind/web/app_dev.php:0 0.0166 6042728 2. Symfony\Component\HttpKernel\Kernel->handle() /var/www/adwind/web/app_dev.php:25 0.2128 10057152 3. Symfony\Bundle\FrameworkBundle\HttpKernel->handle() /var/www/adwind/app/bootstrap.php.cache:617 0.2129 10058808 4. Symfony\Component\HttpKernel\HttpKernel->handle() /var/www/adwind/app/bootstrap.php.cache:1566 0.2129 10058808 5. Symfony\Component\HttpKernel\HttpKernel->handleRaw() /var/www/adwind/app/bootstrap.php.cache:1390 2.1839 21851024 6. call_user_func_array() /var/www/adwind/app/bootstrap.php.cache:1426 2.1840 21851640 7. Adwind\BannerBundle\Controller\BannerController->listAction() /var/www/adwind/app/bootstrap.php.cache:1426 2.2085 22257080 8. Knp\Component\Pager\Paginator->paginate() /var/www/adwind/src/Adwind/BannerBundle/Controller/BannerController.php:76 2.2173 22401584 9. Symfony\Component\HttpKernel\Debug\ContainerAwareTraceableEventDispatcher->dispatch() /var/www/adwind/vendor/knplabs/knp-components/src/Knp/Component/Pager/Paginator.php:97 2.2173 22403912 10. Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() /var/www/adwind/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php:78 2.2175 22406864 11. Symfony\Component\EventDispatcher\EventDispatcher->dispatch() /var/www/adwind/app/cache/dev/classes.php:5072 2.2176 22410128 12. Symfony\Component\HttpKernel\Debug\ContainerAwareTraceableEventDispatcher->doDispatch() /var/www/adwind/app/cache/dev/classes.php:4854 2.2254 22490968 13. call_user_func() /var/www/adwind/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php:139 2.2254 22491024 14. Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\QuerySubscriber->items() /var/www/adwind/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php:139
我正在使用 github 自述文件中的示例:
$em = $this->get('doctrine.orm.entity_manager');
$dql = "SELECT a FROM AdwindBannerBundle:Banner a";
$query = $em->createQuery($dql);
$pagination = $this->get('knp_paginator')->paginate($query,$page,10);
如果我传递结果数组而不是查询本身,一切正常。 即:
$query = $em->createQuery($dql)->getResult();
但据我了解,您应该能够传递查询本身,甚至是查询生成器。 我也想象这样我会得到所有的结果,而不仅仅是一页。
ps:我正在使用分页器包的 dev-master 版本
【问题讨论】:
【参考方案1】:尝试在composer.json中使用特殊版本的knp-сomponents
“knplabs/knp-components”:“1.2.1”,
我认为当前版本有错误
至少现在对我有用
【讨论】:
嗨,有一段时间无法测试这个了 :) 我现在测试了它,它确实有效,我现在可以将 QueryBuilder 或 Query 传递给分页器。所以现在可以看到结果了。但是似乎 knp_pagination_render twig 函数现在不起作用,所以我看不到任何分页按钮....再次这适用于数组,但不适用于 querybuilder 或查询...我尝试将 knplabs/knp-paginator-bundle 恢复为2.3.2 而不是 dev-master,但没有运气......无论如何,我认为我现在不会使用 knp 分页器,直到下一个版本:) thx 的帮助!【参考方案2】:这对我有用:
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQueryBuilder();
$query->select(array('b'))
->from('MyMainBundle:Customer', 'b')
->orderBy('b.updated_at', 'desc');
$paginator = $this->get('knp_paginator');
$requests = $paginator->paginate($query,
$this->get('request')->query->get('page', 1), 5);
目前分页器可以分页:
数组 学说\ORM\查询 Doctrine\ORM\QueryBuilder Doctrine\ODM\MongoDB\Query\Query Doctrine\ODM\MongoDB\Query\Builder Doctrine\Common\Collection\ArrayCollection - 任何学说关系 收藏包括 ModelCriteria - 推进 ORM 查询 以 Solarium_Client 和 Solarium_Query_Select 作为元素的数组【讨论】:
太奇怪了...我尝试了您的代码,传递了查询生成器而不是查询,并且我不断收到相同的错误,只要执行 getResult() 错误就会消失...必须我的安装出了点问题.. 无论如何都感谢您尝试 ;)以上是关于knp 分页器仅适用于数组的主要内容,如果未能解决你的问题,请参考以下文章