66
77use InvalidArgumentException ;
88use PhpList \Core \Domain \Common \Model \Filter \FilterRequestInterface ;
9+ use PhpList \Core \Domain \Common \Model \PaginatedResult ;
910use PhpList \Core \Domain \Common \Repository \AbstractRepository ;
1011use PhpList \Core \Domain \Common \Repository \Interfaces \PaginatableRepositoryInterface ;
1112use PhpList \Core \Domain \Identity \Model \AdminAttributeValue ;
1213use PhpList \Core \Domain \Identity \Model \Filter \AdminAttributeValueFilter ;
14+ use PhpList \Core \Domain \Subscription \Model \SubscriberAttributeValue ;
1315
1416class AdminAttributeValueRepository extends AbstractRepository implements PaginatableRepositoryInterface
1517{
@@ -26,29 +28,47 @@ public function findOneByAdminIdAndAttributeId(int $adminId, int $definitionId):
2628 ->getOneOrNullResult ();
2729 }
2830
29-
3031 /**
31- * @return AdminAttributeValue[]
32+ * @return PaginatedResult<SubscriberAttributeValue>
3233 * @throws InvalidArgumentException
3334 */
34- public function getFilteredAfterId (int $ lastId , int $ limit , ?FilterRequestInterface $ filter = null ): array
35- {
35+ public function getFilteredAfterId (
36+ int $ lastId ,
37+ int $ limit ,
38+ ?FilterRequestInterface $ filter = null
39+ ): PaginatedResult {
3640 if (!$ filter instanceof AdminAttributeValueFilter) {
3741 throw new InvalidArgumentException ('Expected AdminAttributeValueFilter. ' );
3842 }
39- $ query = $ this ->createQueryBuilder ('aav ' )
43+ $ queryBuilder = $ this ->createQueryBuilder ('aav ' )
4044 ->join ('aav.administrator ' , 'a ' )
41- ->join ('aav.attributeDefinition ' , 'ad ' )
42- ->where ('ad.id > :lastId ' )
43- ->setParameter ('lastId ' , $ lastId );
45+ ->join ('aav.attributeDefinition ' , 'ad ' );
4446
4547 if ($ filter ->getAdminId () !== null ) {
46- $ query ->andWhere ('a.id = :adminId ' )
48+ $ queryBuilder ->andWhere ('a.id = :adminId ' )
4749 ->setParameter ('adminId ' , $ filter ->getAdminId ());
4850 }
49- return $ query ->orderBy ('ad.id ' , 'ASC ' )
51+
52+ $ countQb = clone $ queryBuilder ;
53+ $ total = (int ) $ countQb
54+ ->select ('COUNT(DISTINCT aav.id) ' )
55+ ->getQuery ()
56+ ->getSingleScalarResult ();
57+
58+ /** @var list<SubscriberAttributeValue> $items */
59+ $ items = $ queryBuilder
60+ ->andWhere ('aav.id > :lastId ' )
61+ ->setParameter ('lastId ' , $ lastId )
62+ ->orderBy ('aav.id ' , 'ASC ' )
5063 ->setMaxResults ($ limit )
5164 ->getQuery ()
5265 ->getResult ();
66+
67+ return new PaginatedResult (
68+ items: $ items ,
69+ total: $ total ,
70+ limit: $ limit ,
71+ lastId: $ lastId ,
72+ );
5373 }
5474}
0 commit comments