bulton-fr / doctrine_yield
添加一个通过 Doctrine 生成结果的系统
1.0.0
2019-04-12 00:00 UTC
Requires
- php: ^7.0
- doctrine/orm: ^2.6
This package is auto-updated.
Last update: 2024-08-29 05:09:10 UTC
README
一个特质,允许你使用方法生成 Doctrine 结果。
注意:仅在 Doctrine 2.6
上测试过。
但如果尊重 semver,它应该在所有 2.x 版本上运行。
安装它
composer require bulton-fr/doctrine_yield
如何使用它
在你的仓库类中,添加特质如下
<?php namespace MyBundle\Repository; use Doctrine\ORM\EntityRepository; use BultonFr\DoctrineYield\RepositoryYieldTrait; class MyEntityRepository extends EntityRepository { use RepositoryYieldTrait; }
并且在你想要获取数据的地方(例如控制器)
<?php namespace MyBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; class ExampleController extends Controller { public function indexAction() { $em = $this->getDoctrine()->getManager(); /** @var Generator $allData */ $allData = $em ->getRepository('MyBundle:MyEntity') ->yieldAll() ; //[...] } }
它是如何工作的
在特质中,你有 yieldAll
方法,它使用 QueryBuilder
作为参数调用 yieldQuery
。
我们从 QueryBuilder
获取 Query
实例,并调用 Query::iterate
来遍历每一行,并生成每一行。
iterate
执行 fetchRow
来获取下一行。所以我们不会获取所有行来遍历和生成。
为了避免 Doctrine 的内存溢出,我们将生成的每一行从 EntityManager 中“分离”出来。如果你不想分离行,可以将参数 $detachRows
定义为 false
。在 yieldAll
方法中,它是第一个参数。
使用自定义查询生成
你可以使用与 yieldAll
方法相同的方式使用自定义查询进行生成。在你的自定义查询末尾,而不是返回某个值,你需要执行 yield from $this->yieldQuery($qb);
。
同时别忘了在你的仓库中包含这个特质。