repository = $entityManager->getRepository(Result::class); } public function find($id, ?int $lockMode = null, ?int $lockVersion = null): ?Result { return $this->repository->find($id, $lockMode, $lockVersion); } /** * @return array */ public function findAll(): array { return $this->repository->findAll(); } public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null) { return $this->repository->findBy($criteria, $orderBy, $limit, $offset); } /** * * @return Result[] */ public function findBySocialActionWithDescendants(SocialAction $action, $orderBy = null, $limit = null, $offset = null): array { $qb = $this->buildQueryBySocialActionWithDescendants($action); $qb->select('r'); foreach ($orderBy as $sort => $order) { $qb->addOrderBy('r.'.$sort, $order); } return $qb ->setMaxResults($limit) ->setFirstResult($offset) ->getQuery() ->getResult() ; } public function countBySocialActionWithDescendants(SocialAction $action): int { $qb = $this->buildQueryBySocialActionWithDescendants($action); $qb->select('COUNT(r)'); return $qb ->getQuery() ->getSingleScalarResult() ; } protected function buildQueryBySocialActionWithDescendants(SocialAction $action): QueryBuilder { $actions = $action->getDescendantsWithThis(); $qb = $this->repository->createQueryBuilder('r'); $orx = $qb->expr()->orX(); $i = 0; foreach ($actions as $action) { $orx->add(":action_{$i} MEMBER OF r.socialActions"); $qb->setParameter("action_{$i}", $action); } $qb->where($orx); return $qb; } protected function buildQueryByGoal(Goal $goal): QueryBuilder { $qb = $this->repository->createQueryBuilder('r'); $qb->where(":goal MEMBER OF r.goals") ->setParameter('goal', $goal) ; return $qb; } /** * @return Result[] */ public function findByGoal(Goal $goal, $orderBy = null, $limit = null, $offset = null): array { $qb = $this->buildQueryByGoal($goal); foreach ($orderBy as $sort => $order) { $qb->addOrderBy('r.'.$sort, $order); } return $qb ->select('r') ->setMaxResults($limit) ->setFirstResult($offset) ->getQuery() ->getResult() ; } public function countByGoal(Goal $goal): int { $qb = $this->buildQueryByGoal($goal); $qb->select('COUNT(r)'); return $qb ->getQuery() ->getSingleScalarResult() ; } /** * @return array */ public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array { return $this->repository->findBy($criteria, $orderBy, $limit, $offset); } public function findOneBy(array $criteria, ?array $orderBy = null): ?Result { return $this->repository->findOneBy($criteria, $orderBy); } /** * @return class-string */ public function getClassName(): string { return Result::class; } }