Add a helper method to refresh all (or some) entities of a given class
[MAILPOET-5845]
This commit is contained in:
@@ -111,6 +111,24 @@ abstract class Repository {
|
|||||||
$this->entityManager->refresh($entity);
|
$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() {
|
public function flush() {
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
@@ -56,6 +56,80 @@ class RepositoryTest extends \MailPoetTest {
|
|||||||
$this->assertSame($this->getEntityFromIdentityMap($setting3->getId()), $setting3);
|
$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 {
|
private function createSetting(string $name, string $value): SettingEntity {
|
||||||
$setting = new SettingEntity();
|
$setting = new SettingEntity();
|
||||||
$setting->setName($name);
|
$setting->setName($name);
|
||||||
|
Reference in New Issue
Block a user