66use App \Entity \Friend ;
77use App \Entity \Member ;
88use Doctrine \ORM \EntityRepository ;
9- use Pagerfanta \Doctrine \ORM \QueryAdapter ;
9+ use Doctrine \ORM \QueryBuilder ;
10+ use Pagerfanta \Adapter \ArrayAdapter ;
1011use Pagerfanta \Pagerfanta ;
1112
12- /**
13- * FamilyAndFriendRepository.
14- */
1513class FriendRepository extends EntityRepository
1614{
1715 public function getFamilyAndFriendsCount (Member $ member ): int
1816 {
19- $ qb = $ this ->createQueryBuilder ('r ' );
17+ $ qb = $ this ->createQueryBuilder ('f ' );
2018
2119 return
2220 (int ) $ qb
23- ->select ('count(r.left) ' )
24- ->where ('r.confirmed = :confirmed ' )
21+ ->select ('count(f.left) ' )
22+ ->join ('f.left ' , 'l ' )
23+ ->join ('f.right ' , 'r ' )
24+ ->where ('f.confirmed = :confirmed ' )
2525 ->andWhere (
2626 $ qb ->expr ()->orX (
27- $ qb ->expr ()->eq ('r.left ' , ':member ' ),
28- $ qb ->expr ()->eq ('r.right ' , ':member ' )
27+ $ qb ->expr ()->eq ('f.left ' , ':member ' ),
28+ $ qb ->expr ()->eq ('f.right ' , ':member ' )
29+ )
30+ )
31+ ->andWhere (
32+ $ qb ->expr ()->orX (
33+ $ qb ->expr ()->in ('l.status ' , ':status ' ),
34+ $ qb ->expr ()->in ('r.status ' , ':status ' )
2935 )
3036 )
3137 ->setParameter ('member ' , $ member )
38+ ->setParameter ('status ' , MemberStatusType::ACTIVE_ALL_ARRAY )
3239 ->setParameter ('confirmed ' , true )
3340 ->getQuery ()
3441 ->getSingleScalarResult ()
3542 ;
3643 }
3744
45+ public function getNumberOfFriendsFor (Member $ member ): int
46+ {
47+ $ qb = $ this ->getFriendsForQueryBuilder ($ member );
48+ $ qb ->select ('count(f.left) ' );
49+
50+ return $ qb ->getQuery ()->getSingleScalarResult ();
51+ }
52+
3853 public function findFriendsFor (Member $ member ): mixed
3954 {
4055 $ qb = $ this ->createQueryBuilder ('f ' );
@@ -54,8 +69,8 @@ public function findFriendsFor(Member $member): mixed
5469 ->andWhere ($ qb ->expr ()->in ('r.status ' , ':status ' ))
5570 ->setParameter ('member ' , $ member )
5671 ->setParameter ('confirmed ' , 1 )
57- ->setParameter ('status ' , MemberStatusType::MEMBER_COMMENTS_ARRAY )
58- ->orderBy ('r .updated ' , 'DESC ' )
72+ ->setParameter ('status ' , MemberStatusType::ACTIVE_ALL_ARRAY )
73+ ->orderBy ('f .updated ' , 'DESC ' )
5974 ->getQuery ()
6075 ->getResult ()
6176 ;
@@ -97,29 +112,46 @@ public function findUnconfirmedRelationBetween(Member $relation1, Member $relati
97112 ;
98113 }
99114
100- public function getFriends (Member $ member , int $ page ): Pagerfanta
115+ public function getFriends (Member $ member , int $ page , int $ itemsPerPage = 50 ): Pagerfanta
116+ {
117+ $ qb = $ this ->getFriendsForQueryBuilder ($ member );
118+
119+ $ query = $ qb ->getQuery ();
120+ $ results = $ query ->getResult ();
121+
122+ $ friends = new Pagerfanta (new ArrayAdapter ($ results ));
123+
124+ // $items per page will be 5, 10, 20, 50, 100 here we want a number dividable by 6
125+ // as for bigger viewports we use 6 friends per row. We use the next larger number
126+ // that is dividable by 6 (6, 12, 24, 54, 102).
127+ $ itemsPerPage = ($ itemsPerPage / 6 + 1 ) * 6 ;
128+ $ friends ->setMaxPerPage ($ itemsPerPage );
129+ $ friends ->setCurrentPage ($ page );
130+
131+ return $ friends ;
132+ }
133+
134+ private function getFriendsForQueryBuilder ($ member ): QueryBuilder
101135 {
102136 $ qb = $ this ->createQueryBuilder ('f ' );
103- $ qb
104- ->leftJoin ('f.left ' , 'l ' )
105- ->leftJoin ('f.right ' , 'r ' )
137+
138+ return $ qb
106139 ->where ('f.confirmed = :confirmed ' )
140+ ->join ('f.left ' , 'l ' )
141+ ->join ('f.right ' , 'r ' )
107142 ->andWhere (
108143 $ qb ->expr ()
109144 ->orX (
110145 $ qb ->expr ()->eq ('f.left ' , ':member ' ),
111146 $ qb ->expr ()->eq ('f.right ' , ':member ' ),
112147 )
113148 )
149+ ->andWhere ($ qb ->expr ()->in ('l.status ' , ':status ' ))
150+ ->andWhere ($ qb ->expr ()->in ('r.status ' , ':status ' ))
114151 ->setParameter ('member ' , $ member )
115152 ->setParameter ('confirmed ' , 1 )
116- ->orderBy ('l.created ' , 'ASC ' )
153+ ->setParameter ('status ' , MemberStatusType::ACTIVE_ALL_ARRAY )
154+ ->orderBy ('r.updated ' , 'DESC ' )
117155 ;
118-
119- $ notes = new Pagerfanta (new QueryAdapter ($ qb ->getQuery ()));
120- $ notes ->setMaxPerPage (30 );
121- $ notes ->setCurrentPage ($ page );
122-
123- return $ notes ;
124156 }
125157}
0 commit comments