tics) { $tagsList[] = [ 'label' => sprintf('%s (%s)', $tagStatistics['name'], number_format((float)$tagStatistics['subscribersCount'])), 'value' => $tagStatistics['id'], ]; } array_unshift($tagsList, $allTagsList); return $tagsList; } private function getDataForDynamicSegment(ListingDefinition $definition, SegmentEntity $segment) { $queryBuilder = clone $this->queryBuilder; $sortBy = Helpers::underscoreToCamelCase($definition->getSortBy()) ?: self::DEFAULT_SORT_BY; $this->applySelectClause($queryBuilder); $this->applyFromClause($queryBuilder); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscribersIdsQuery = $this->entityManager ->getConnection() ->createQueryBuilder() ->select("DISTINCT $subscribersTable.id") ->from($subscribersTable); $subscribersIdsQuery = $this->applyConstraintsForDynamicSegment($subscribersIdsQuery, $definition, $segment); $subscribersIdsQuery->orderBy("$subscribersTable." . Helpers::camelCaseToUnderscore($sortBy), $definition->getSortOrder()); $subscribersIdsQuery->setFirstResult($definition->getOffset()); $subscribersIdsQuery->setMaxResults($definition->getLimit()); $idsStatement = $subscribersIdsQuery->executeQuery(); $result = $idsStatement->fetchAll(); $ids = array_column($result, 'id'); if (count($ids)) { $queryBuilder->andWhere('s.id IN (:subscriberIds)') ->setParameter('subscriberIds', $ids); } else { $queryBuilder->andWhere('0 = 1'); // Don't return any subscribers if no ids found } $this->applySorting($queryBuilder, $sortBy, $definition->getSortOrder()); return $queryBuilder->getQuery()->getResult(); } private function applyConstraintsForDynamicSegment( DBALQueryBuilder $subscribersQuery, ListingDefinition $definition, SegmentEntity $segment ) { // Apply dynamic segments filters $subscribersQuery = $this->dynamicSegmentsFilter->apply($subscribersQuery, $segment); // Apply group, search to fetch only necessary ids $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); if ($definition->getSearch()) { $search = Helpers::escapeSearch((string)$definition->getSearch()); $subscribersQuery ->andWhere("$subscribersTable.email LIKE :search or $subscribersTable.first_name LIKE :search or $subscribersTable.last_name LIKE :search") ->setParameter('search', "%$search%"); } if ($definition->getGroup()) { if ($definition->getGroup() === 'trash') { $subscribersQuery->andWhere("$subscribersTable.deleted_at IS NOT NULL"); } else { $subscribersQuery->andWhere("$subscribersTable.deleted_at IS NULL"); } if (in_array($definition->getGroup(), self::$supportedStatuses)) { $subscribersQuery ->andWhere("$subscribersTable.status = :status") ->setParameter('status', $definition->getGroup()); } } return $subscribersQuery; } private function getDynamicSegmentFromFilters(ListingDefinition $definition): ?SegmentEntity { $filters = $definition->getFilters(); if (!$filters || !isset($filters['segment'])) { return null; } if ($filters['segment'] === self::FILTER_WITHOUT_LIST) { return null; } $segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']); if (!$segment instanceof SegmentEntity) { return null; } return $segment->isStatic() ? null : $segment; } }