bulton-fr/doctrine_yield

添加一个通过 Doctrine 生成结果的系统

1.0.0 2019-04-12 00:00 UTC

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);
同时别忘了在你的仓库中包含这个特质。