承接 adawolfa/batchtrine 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

adawolfa/batchtrine

最新稳定版本:1.0.2

Composer 安装命令:

composer require adawolfa/batchtrine

包简介

Garbage collector for easy batch processing with Doctrine ORM.

README 文档

README

Simple garbage collector for easy batch processing with Doctrine ORM.

Installation

composer require adawolfa/batchtrine

Usage

The GC works by copying the identity map from the Unit of Work at the start of each batch and later selectively detaching all the entities that weren't previously part of it. Such entities shouldn't generally be used outside the scope of the batch.

This is supposed to solve the problem with EntityManager::clear(), which renders all the existing references to entities throughout the application invalid, and it's much more straightforward than detaching entities manually.

Single batch

The batch() method runs the supplied callback, forwards its return value and detaches all entities that have been loaded or created during its execution.

$gc = new Adawolfa\Batchtrine\GC($em);

$a = $em->getRepository(Entity::class)->findBy(['code' => 'a']);

$b = $gc->batch(function () use ($em): Entity {
	return $em->getRepository(Entity::class)->findBy(['code' => 'b']);
});

$em->contains($a); // true
$em->contains($b); // false - entity is detached

Iterator

The iterate() method returns a proxy iterator which periodically performs the GC cycle after set number of iterations ($interval).

$a = $em->getRepository(Entity::class)->findBy(['code' => 'a']);

foreach ($gc->iterate($ids) as $id) {
	$entity = $em->getRepository(Entity::class)->find($id);
	assert($a !== $entity);
	// ...
}

$em->contains($a);      // true
$em->contains($entity); // false

Pagination

The paginate() method is useful for traversing through a large result set Doctrine\ORM\Query. The results are obtained by executing the query repeatedly with a smaller limit ($interval) and increasing offset. The GC cycle happens every time before a new result page is fetched.

$a = $em->getRepository(Entity::class)->findBy(['code' => 'a']);

$query = $em->createQueryBuilder()
	->select('e')
	->from(Entity::class, 'e')
	->getQuery();

foreach ($gc->paginate($query) as $entity) {
	assert($a !== $entity);
	// ...
}

$em->contains($a);      // true
$em->contains($entity); // false

For frequently changing data, you should use search-after approach instead.

$query = $em->createQueryBuilder()
	->select('e')
	->from(Entity::class, 'e')
	->where('e.id > :id')
	->orderBy('e.id')
	->getQuery();

$after = function (Query $query, ?Entity $last): void {
	$query->setParameter('id', $last?->id ?? 0);
};

foreach ($gc->paginate($query, after: $after) as $entity) {
	assert($a !== $entity);
	// ...
}

统计信息

  • 总下载量: 287
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-02-18