Use a query for duplication of segment subscribers
[MAILPOET-3170]
This commit is contained in:
@@ -5,26 +5,20 @@ namespace MailPoet\Segments;
|
|||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
use MailPoet\Entities\SegmentEntity;
|
use MailPoet\Entities\SegmentEntity;
|
||||||
use MailPoet\Entities\SubscriberSegmentEntity;
|
use MailPoet\Entities\SubscriberSegmentEntity;
|
||||||
use MailPoet\Subscribers\SubscriberSegmentRepository;
|
|
||||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
class SegmentSaveController {
|
class SegmentSaveController {
|
||||||
/** @var SegmentsRepository */
|
/** @var SegmentsRepository */
|
||||||
private $segmentsRepository;
|
private $segmentsRepository;
|
||||||
|
|
||||||
/** @var SubscriberSegmentRepository */
|
|
||||||
private $subscriberSegmentRepository;
|
|
||||||
|
|
||||||
/** @var EntityManager */
|
/** @var EntityManager */
|
||||||
private $entityManager;
|
private $entityManager;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
SegmentsRepository $segmentsRepository,
|
SegmentsRepository $segmentsRepository,
|
||||||
SubscriberSegmentRepository $subscriberSegmentRepository,
|
|
||||||
EntityManager $entityManager
|
EntityManager $entityManager
|
||||||
) {
|
) {
|
||||||
$this->segmentsRepository = $segmentsRepository;
|
$this->segmentsRepository = $segmentsRepository;
|
||||||
$this->subscriberSegmentRepository = $subscriberSegmentRepository;
|
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,25 +38,22 @@ class SegmentSaveController {
|
|||||||
|
|
||||||
$this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId());
|
$this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId());
|
||||||
|
|
||||||
$subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]);
|
$this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $segmentEntity) {
|
||||||
|
|
||||||
$this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $subscriberSegments) {
|
|
||||||
$entityManager->persist($duplicate);
|
$entityManager->persist($duplicate);
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
|
|
||||||
foreach ($subscriberSegments as $subscriberSegment) {
|
$subscriberSegmentTable = $entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
|
||||||
$subscriber = $subscriberSegment->getSubscriber();
|
$conn = $this->entityManager->getConnection();
|
||||||
if (!$subscriber) {
|
$stmt = $conn->prepare("
|
||||||
continue;
|
INSERT INTO $subscriberSegmentTable (segment_id, subscriber_id, status, created_at)
|
||||||
}
|
SELECT :duplicateId, subscriber_id, status, NOW()
|
||||||
$subscriberDuplicate = new SubscriberSegmentEntity(
|
FROM $subscriberSegmentTable
|
||||||
$duplicate,
|
WHERE segment_id = :segmentId
|
||||||
$subscriber,
|
");
|
||||||
$subscriberSegment->getStatus()
|
$stmt->execute([
|
||||||
);
|
'duplicateId' => $duplicate->getId(),
|
||||||
$entityManager->persist($subscriberDuplicate);
|
'segmentId' => $segmentEntity->getId(),
|
||||||
}
|
]);
|
||||||
$entityManager->flush();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return $duplicate;
|
return $duplicate;
|
||||||
|
Reference in New Issue
Block a user