Use Doctrine's orphan removal for newsletter segments
[MAILPOET-2900]
This commit is contained in:
@ -133,7 +133,7 @@ class NewsletterEntity {
|
||||
private $children;
|
||||
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="MailPoet\Entities\NewsletterSegmentEntity", mappedBy="newsletter")
|
||||
* @ORM\OneToMany(targetEntity="MailPoet\Entities\NewsletterSegmentEntity", mappedBy="newsletter", orphanRemoval=true)
|
||||
* @var NewsletterSegmentEntity[]|ArrayCollection
|
||||
*/
|
||||
private $newsletterSegments;
|
||||
|
@ -177,9 +177,6 @@ class NewsletterSaveController {
|
||||
}
|
||||
|
||||
private function updateSegments(NewsletterEntity $newsletter, array $segments) {
|
||||
$oldNewsletterSegments = $newsletter->getNewsletterSegments()->toArray();
|
||||
|
||||
// clear old & add new newsletter segments
|
||||
$newsletter->getNewsletterSegments()->clear();
|
||||
foreach ($segments as $segment) {
|
||||
if (!is_array($segment) || !isset($segment['id'])) {
|
||||
@ -198,12 +195,6 @@ class NewsletterSaveController {
|
||||
}
|
||||
$newsletter->getNewsletterSegments()->add($newsletterSegment);
|
||||
}
|
||||
|
||||
// remove orphaned newsletter segments
|
||||
foreach (array_diff($oldNewsletterSegments, $newsletter->getNewsletterSegments()->toArray()) as $newsletterSegment) {
|
||||
$this->newsletterSegmentRepository->remove($newsletterSegment);
|
||||
}
|
||||
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
|
56
tests/integration/Entities/NewsletterEntityTest.php
Normal file
56
tests/integration/Entities/NewsletterEntityTest.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace MailPoet\Entities;
|
||||
|
||||
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
|
||||
|
||||
class NewsletterEntityTest extends \MailPoetTest {
|
||||
public function _before() {
|
||||
$this->cleanup();
|
||||
}
|
||||
|
||||
public function testItRemovesOrphanedSegmentRelations() {
|
||||
$newsletter = $this->createNewsletter();
|
||||
$segment = $this->createSegment();
|
||||
$newsletterSegment = new NewsletterSegmentEntity($newsletter, $segment);
|
||||
$this->entityManager->persist($newsletterSegment);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$this->entityManager->refresh($newsletter);
|
||||
expect($newsletter->getNewsletterSegments()->count())->same(1);
|
||||
|
||||
$newsletter->getNewsletterSegments()->removeElement($newsletterSegment);
|
||||
$this->entityManager->flush();
|
||||
expect($newsletter->getNewsletterSegments()->count())->same(0);
|
||||
|
||||
$newsletterSegments = $this->diContainer->get(NewsletterSegmentRepository::class)->findBy(['newsletter' => $newsletter]);
|
||||
expect($newsletterSegments)->count(0);
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
$this->cleanup();
|
||||
}
|
||||
|
||||
private function createNewsletter(): NewsletterEntity {
|
||||
$newsletter = new NewsletterEntity();
|
||||
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
|
||||
$newsletter->setSubject('Subject');
|
||||
$this->entityManager->persist($newsletter);
|
||||
return $newsletter;
|
||||
}
|
||||
|
||||
private function createSegment(): SegmentEntity {
|
||||
$segment = new SegmentEntity();
|
||||
$segment->setType(SegmentEntity::TYPE_DEFAULT);
|
||||
$segment->setName('Segment');
|
||||
$segment->setDescription('Segment description');
|
||||
$this->entityManager->persist($segment);
|
||||
return $segment;
|
||||
}
|
||||
|
||||
private function cleanup() {
|
||||
$this->truncateEntity(NewsletterEntity::class);
|
||||
$this->truncateEntity(NewsletterSegmentEntity::class);
|
||||
$this->truncateEntity(SegmentEntity::class);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user