From 682527cd1b048cdbbc7b6c0b868c5b51e75b3878 Mon Sep 17 00:00:00 2001 From: Jan Jakes Date: Thu, 18 Jan 2024 17:55:15 +0100 Subject: [PATCH] Add a helper method to refresh all (or some) entities of a given class [MAILPOET-5845] --- mailpoet/lib/Doctrine/Repository.php | 18 +++++ .../integration/Doctrine/RepositoryTest.php | 74 +++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/mailpoet/lib/Doctrine/Repository.php b/mailpoet/lib/Doctrine/Repository.php index e4a689746c..5498be6ee3 100644 --- a/mailpoet/lib/Doctrine/Repository.php +++ b/mailpoet/lib/Doctrine/Repository.php @@ -111,6 +111,24 @@ abstract class Repository { $this->entityManager->refresh($entity); } + /** + * @param callable(T): bool|null $filter + */ + public function refreshAll(callable $filter = null): void { + $className = $this->getEntityClassName(); + $rootClassName = $this->entityManager->getClassMetadata($className)->rootEntityName; + $entities = $this->entityManager->getUnitOfWork()->getIdentityMap()[$rootClassName] ?? []; + foreach ($entities as $entity) { + if (!($entity instanceof $className)) { + continue; + } + if ($filter && !$filter($entity)) { + continue; + } + $this->entityManager->refresh($entity); + } + } + public function flush() { $this->entityManager->flush(); } diff --git a/mailpoet/tests/integration/Doctrine/RepositoryTest.php b/mailpoet/tests/integration/Doctrine/RepositoryTest.php index 48f5a34e70..8a2bb83193 100644 --- a/mailpoet/tests/integration/Doctrine/RepositoryTest.php +++ b/mailpoet/tests/integration/Doctrine/RepositoryTest.php @@ -56,6 +56,80 @@ class RepositoryTest extends \MailPoetTest { $this->assertSame($this->getEntityFromIdentityMap($setting3->getId()), $setting3); } + public function testItCanRefreshAll(): void { + $repository = $this->createRepository(); + + $setting1 = $this->createSetting('name-1', 'value-1'); + $setting2 = $this->createSetting('name-2', 'value-2'); + $setting3 = $this->createSetting('name-3', 'value-3'); + + $this->entityManager->createQueryBuilder() + ->update(SettingEntity::class, 's') + ->set('s.value', ':value') + ->where('s.name = :name') + ->setParameter('value', 'new-value-1') + ->setParameter('name', 'name-1') + ->getQuery() + ->execute(); + + $this->entityManager->createQueryBuilder() + ->update(SettingEntity::class, 's') + ->set('s.value', ':value') + ->where('s.name = :name') + ->setParameter('value', 'new-value-2') + ->setParameter('name', 'name-2') + ->getQuery() + ->execute(); + + $this->assertSame($setting1->getValue(), 'value-1'); + $this->assertSame($setting2->getValue(), 'value-2'); + $this->assertSame($setting3->getValue(), 'value-3'); + + $repository->refreshAll(); + + $this->assertSame($setting1->getValue(), 'new-value-1'); + $this->assertSame($setting2->getValue(), 'new-value-2'); + $this->assertSame($setting3->getValue(), 'value-3'); + } + + public function testItCanRefreshSelectively(): void { + $repository = $this->createRepository(); + + $setting1 = $this->createSetting('name-1', 'value-1'); + $setting2 = $this->createSetting('name-2', 'value-2'); + $setting3 = $this->createSetting('name-3', 'value-3'); + + $this->entityManager->createQueryBuilder() + ->update(SettingEntity::class, 's') + ->set('s.value', ':value') + ->where('s.name = :name') + ->setParameter('value', 'new-value-1') + ->setParameter('name', 'name-1') + ->getQuery() + ->execute(); + + $this->entityManager->createQueryBuilder() + ->update(SettingEntity::class, 's') + ->set('s.value', ':value') + ->where('s.name = :name') + ->setParameter('value', 'new-value-2') + ->setParameter('name', 'name-2') + ->getQuery() + ->execute(); + + $this->assertSame($setting1->getValue(), 'value-1'); + $this->assertSame($setting2->getValue(), 'value-2'); + $this->assertSame($setting3->getValue(), 'value-3'); + + $repository->refreshAll(function (SettingEntity $setting) { + return in_array($setting->getName(), ['name-1', 'name-3'], true); + }); + + $this->assertSame($setting1->getValue(), 'new-value-1'); + $this->assertSame($setting2->getValue(), 'value-2'); + $this->assertSame($setting3->getValue(), 'value-3'); + } + private function createSetting(string $name, string $value): SettingEntity { $setting = new SettingEntity(); $setting->setName($name);