, * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace Chill\ActivityBundle\Repository; use Chill\ActivityBundle\Entity\Activity; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\Person; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; /** * @method AccompanyingPeriodParticipation|null find($id, $lockMode = null, $lockVersion = null) * @method AccompanyingPeriodParticipation|null findOneBy(array $criteria, array $orderBy = null) * @method AccompanyingPeriodParticipation[] findAll() * @method AccompanyingPeriodParticipation[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class ActivityRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Activity::class); } /** * @param $person * @param array $scopes * @param string[] $orderBy * @param int $limit * @param int $offset * @return array|Activity[] */ public function findByPersonImplied(Person $person, array $scopes, ?array $orderBy = [ 'date' => 'DESC'], ?int $limit = 100, ?int $offset = 0): array { $qb = $this->createQueryBuilder('a'); $qb->select('a'); $qb ->where($qb->expr()->in('a.scope', ':scopes')) ->setParameter('scopes', $scopes) ->andWhere( $qb->expr()->orX( $qb->expr()->eq('a.person', ':person'), ':person MEMBER OF a.persons' ) ) ->setParameter('person', $person) ; foreach ($orderBy as $k => $dir) { $qb->addOrderBy('a.'.$k, $dir); } $qb->setMaxResults($limit)->setFirstResult($offset); return $qb->getQuery() ->getResult(); } /** * @param AccompanyingPeriod $period * @param array $scopes * @param int|null $limit * @param int|null $offset * @param array|string[] $orderBy * @return array|Activity[] */ public function findByAccompanyingPeriod(AccompanyingPeriod $period, array $scopes, ?bool $allowNullScope = false, ?int $limit = 100, ?int $offset = 0, array $orderBy = ['date' => 'desc']): array { $qb = $this->createQueryBuilder('a'); $qb->select('a'); if (!$allowNullScope) { $qb ->where($qb->expr()->in('a.scope', ':scopes')) ->setParameter('scopes', $scopes) ; } else { $qb ->where( $qb->expr()->orX( $qb->expr()->in('a.scope', ':scopes'), $qb->expr()->isNull('a.scope') ) ) ->setParameter('scopes', $scopes) ; } $qb ->andWhere( $qb->expr()->eq('a.accompanyingPeriod', ':period') ) ->setParameter('period', $period) ; foreach ($orderBy as $k => $dir) { $qb->addOrderBy('a.'.$k, $dir); } $qb->setMaxResults($limit)->setFirstResult($offset); return $qb->getQuery() ->getResult(); } }