getEntityManager()); $loader->loadResults([$team]); return $team; } /** * @param Team $team * @throws ORMException * @throws \Doctrine\ORM\OptimisticLockException */ public function saveTeam(Team $team) { $entityManager = $this->getEntityManager(); $entityManager->persist($team); $entityManager->flush(); } /** * @param Team $team * @throws ORMException * @throws \Doctrine\ORM\OptimisticLockException */ public function deleteTeam(Team $team) { $entityManager = $this->getEntityManager(); $entityManager->remove($team); $entityManager->flush(); } public function getPagerfantaForQuery(TeamQuery $query): Pagerfanta { $paginator = new Pagerfanta($this->getPaginatorForQuery($query)); $paginator->setMaxPerPage($query->getPageSize()); $paginator->setCurrentPage($query->getPage()); return $paginator; } protected function getPaginatorForQuery(TeamQuery $query): PaginatorInterface { $qb = $this->getQueryBuilderForQuery($query); $qb ->resetDQLPart('select') ->resetDQLPart('orderBy') ->select($qb->expr()->countDistinct('t.id')) ; $counter = (int) $qb->getQuery()->getSingleScalarResult(); $qb = $this->getQueryBuilderForQuery($query); return new LoaderPaginator(new TeamLoader($qb->getEntityManager()), $qb, $counter); } /** * @param TeamQuery $query * @return Timesheet[] */ public function getTeamsForQuery(TeamQuery $query): iterable { // this is using the paginator internally, as it will load all joined entities into the working unit // do not "optimize" to use the query directly, as it would results in hundreds of additional lazy queries $paginator = $this->getPaginatorForQuery($query); return $paginator->getAll(); } private function getQueryBuilderForQuery(TeamQuery $query): QueryBuilder { $qb = $this->getEntityManager()->createQueryBuilder(); $qb ->select('t') ->from(Team::class, 't') ; $orderBy = $query->getOrderBy(); switch ($orderBy) { case 'teamlead': $qb->leftJoin('t.teamlead', 'lead'); $orderBy = 'lead.username'; break; default: $orderBy = 't.' . $orderBy; break; } $qb->addOrderBy($orderBy, $query->getOrder()); if (!empty($query->getSearchTerm())) { $qb->andWhere( $qb->expr()->orX( $qb->expr()->like('t.name', ':likeContains') ) ); $qb->setParameter('likeContains', '%' . $query->getSearchTerm() . '%'); } $this->addPermissionCriteria($qb, $query->getCurrentUser(), $query->getTeams()); return $qb; } private function addPermissionCriteria(QueryBuilder $qb, ?User $user = null, array $teams = []) { // make sure that all queries without a user see all user if (null === $user && empty($teams)) { return; } // make sure that admins see all user if (null !== $user && ($user->isSuperAdmin() || $user->isAdmin())) { return; } if (null !== $user) { $qb ->andWhere('t.teamlead = :id') ->setParameter('id', $user); } } }