<?php
namespace App\Repository;
use App\Entity\AppelAProjet;
use App\Entity\Project;
use App\Entity\QuestionnaireResponse;
use App\Entity\User;
use App\Entity\UserProject;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method UserProject|null find($id, $lockMode = null, $lockVersion = null)
* @method UserProject|null findOneBy(array $criteria, array $orderBy = null)
* @method UserProject[] findAll()
* @method UserProject[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserProjectRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, UserProject::class);
}
/**
* @param string $type
* @param Project $project
* @param User $user
* @return UserProject|null
* @throws NonUniqueResultException
*/
public function getByTypeByProjectByUser(string $type, Project $project, User $user)
{
return $this->createQueryBuilder('u')
->leftJoin('u.questionnaireResponse', 'qr')
->addSelect('qr')
->where('u.type = :type')
->andWhere('u.project = :project')
->andWhere('u.user = :user')
->setParameters([
'type' => $type,
'project' => $project,
'user' => $user
])
->getQuery()
->getSingleResult();
}
/**
* @param $aap
* @param string $type
* @param $status
* @return UserProject[]
*/
public function findByAppelAProjetRelance($aap, string $type, $status) {
return $this->createQueryBuilder('u')
->leftJoin('u.questionnaireResponse', 'qr', 'WITH', 'qr.status = :status')
->addSelect('qr')
->leftjoin('u.project', 'p')
->leftjoin('u.user','user')
->addSelect('user')
->leftjoin('u.girci','g')
->addSelect('g')
->where('p.appelAProjet = :aap')
->andWhere('u.type = :type')
->setParameters([
'aap' => $aap,
'type' => $type,
'status' => $status,
])
->getQuery()
->getResult();
}
/**
* @param array $types
* @param Project $project
* @return UserProject[]
*/
public function findByTypes(array $types, Project $project)
{
return $this->createQueryBuilder('up')
->leftJoin('up.questionnaireResponse', 'qr')
->addSelect('qr')
->where('up.type in (:types)')
->andWhere('up.project = :project')
->setParameters([
'types' => $types,
'project' => $project
])
->getQuery()
->getResult()
;
}
/**
* @param AppelAProjet $appelAProjet
* @return UserProject[]
*/
public function findByAppelAProjetExpertForDelete(AppelAProjet $appelAProjet)
{
return $this->createQueryBuilder('up')
->join('up.project', 'p')
->where('p.appelAProjet = :aap')
->andWhere('up.type = :type')
->setParameters([
'aap' => $appelAProjet,
'type' => QuestionnaireResponse::QR_TYPE_EXPERT,
])
->getQuery()
->getResult()
;
}
/**
* @param Project $project
* @return UserProject[]
*/
public function findByProject(Project $project)
{
return $this->createQueryBuilder('up')
->leftJoin('up.user', 'u')
->addSelect('u')
->leftJoin('up.girci', 'g')
->addSelect('g')
->where('up.project = :project')
->setParameter('project', $project)
->getQuery()
->getResult()
;
}
/**
* @param Project $project
* @return array
*/
public function findOrderedByProject(Project $project)
{
$results = $this->findByProject($project);
$orderedResult = [];
foreach ($results as $result) {
$orderedResult[$result->getType()][] = $result;
}
return $orderedResult;
}
/**
* @param Project $project
* @param string $type
* @return int
*/
public function countByProjectByType(Project $project, string $type)
{
return $this->createQueryBuilder('up')
->select('COUNT(up.id)')
->where('up.project = :project')
->andWhere('up.type = :type')
->setParameters([
'project' => $project,
'type' => $type
])
->getQuery()
->getSingleScalarResult()
;
}
}