<?php
namespace App\Repository;
use App\Entity\Subject;
use App\Entity\SubjectLevel;
use App\Entity\Teacher;
use App\Entity\Category;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method Teacher|null find($id, $lockMode = null, $lockVersion = null)
* @method Teacher|null findOneBy(array $criteria, array $orderBy = null)
* @method Teacher[] findAll()
* @method Teacher[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class TeacherRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Teacher::class);
}
// /**
// * @return Teacher[] Returns an array of Teacher objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('t')
->andWhere('t.exampleField = :val')
->setParameter('val', $value)
->orderBy('t.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
public function findAllForAdminList()
{
return $this->createQueryBuilder('t')
->leftJoin('t.userId', 't_u')
->addSelect('t_u')
->leftJoin('t.categories', 't_c')
->addSelect('t_c')
->leftJoin('t.teacherSubjects', 't_ts')
->addSelect('t_ts')
->leftJoin('t_ts.subject', 't_ts_s')
->addSelect('t_ts_s')
->getQuery()
->getResult();
}
//Optimisé (par moi)
public function teachersList()
{
return $this->createQueryBuilder('t')
->addSelect('user_id')
->leftJoin('t.userId', 'user_id')
->getQuery()
->getResult();
}
public function getActifTeachers()
{
return $this->createQueryBuilder('t')
->leftJoin('t.userId', 'userId')
->addSelect('userId')
->andWhere('t.isActif = :true')
->setParameter('true', true)
->orderBy('userId.firstname')
->getQuery()
->getResult();
}
public function getActifTeachersForSubjectLevel(SubjectLevel $subjectLevel, ?bool $forGroup = null)
{
$query = $this->createQueryBuilder('t')
->leftJoin('t.userId', 'userId')
->innerJoin('t.teacherSubjects', 'teacherSubjects')
->andWhere('teacherSubjects.subject = :subject')
->setParameter('subject', $subjectLevel->getSubject())
->innerJoin('teacherSubjects.fromLevel', 'fromLevel')
->innerJoin('teacherSubjects.toLevel', 'toLevel')
->innerJoin(SubjectLevel::class, 'subjectlevel', Join::WITH, 'subjectlevel.order >= fromLevel.order AND subjectlevel.order <= toLevel.order AND subjectlevel.id = :subjectLevelId')
->setParameter('subjectLevelId', $subjectLevel->getId())
->addSelect('userId')
->andWhere('t.isActif = :true')
->setParameter('true', true)
->orderBy('userId.firstname');
if ($forGroup === true) {
$query->andWhere('teacherSubjects.isGroup = 1');
}
return $query->getQuery()
->getResult();
}
public function getInactiveTeachers()
{
return $this->createQueryBuilder('t')
->leftJoin('t.userId', 'userId')
->addSelect('userId')
->andWhere('t.isActif = :false')
->setParameter('false', false)
->orderBy('userId.firstname')
->getQuery()
->getResult();
}
//Optimisé (par moi)
public function findOneTeacherById($id)
{
return $this->createQueryBuilder('t')
->addSelect('userId')
->leftJoin('t.userId', 'userId')
->andWhere('t.id = :id')
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
}
public function findTeachersHasVideoCourses()
{
return $this->createQueryBuilder('t')
->leftJoin('t.videoPrograms', 'v')
->addSelect('v')
->andWhere('v.teacher = t')
->getQuery()
->getResult();
}
public function findTeachersWithFreeSchedules()
{
$currentDate = new \DateTimeImmutable();
$tomorrow = $currentDate->modify('+1 day');
$limiteDate = $currentDate->modify('+7 days');
return $this->createQueryBuilder('t')
->leftJoin('t.schedules', 's')
->addSelect('s')
->andWhere('s.isFree = :true')
->andWhere('s.forCatchUp = :false')
->setParameter('false', false)
->andWhere('s.isBlocked = :false')
->setParameter('false', false)
->andWhere('s.freeDate BETWEEN :tomorrow AND :limiteDate')
->setParameter('true', true)
->setParameter('tomorrow', $tomorrow)
->setParameter('limiteDate', $limiteDate)
->orderBy('s.freeDate', 'ASC')
->getQuery()
->getResult();
}
public function findTeachersWithFreeSchedulesByCategoryAndGender($categoryNameId, $genderId, $level, $isChild)
{
//reception possible $level : beginner, intermediate, advanced, null
//reception possible isChild : "0", "1", null
//UTILISÉ DANS L'INDEX DES HORAIRES LIBRES AVANT LE CHECKOUT
$currentDate = new \DateTimeImmutable('03:00');
$tomorrow = $currentDate->modify('+1 day');
$limitDate = $currentDate->modify('+8 days');
$qb = $this->createQueryBuilder('teacher')
->leftJoin('teacher.schedules', 's')
->leftJoin('s.scheduleInstitute', 's_si')
->leftJoin('teacher.teacherSubjects', 'ts')
->leftJoin('ts.subject', 'ts_s')
->leftJoin('ts_s.category', 'ts_s_c')
->leftJoin('teacher.categories', 'c')
->leftJoin('teacher.userId', 'userId')
->leftJoin('userId.gender', 'g')
->addSelect('s')
->addSelect('s_si')
->addSelect('ts')
->addSelect('ts_s', 'ts_s_c')
->addSelect('c')
->addSelect('userId')
->addSelect('g')
->andWhere('s.isFree = :true')
->andWhere('s.forCatchUp = :false')
->setParameter('false', false)
->andWhere('s.isBlocked = :false')
->setParameter('false', false)
->andWhere('s.forVideo = :false')
->setParameter('false', false)
->andWhere('s.isForLevelTest = :false')
->setParameter('false', false)
->andWhere('c.id = :categoryNameId')
->setParameter('categoryNameId', $categoryNameId)
->andWhere('s.freeDate BETWEEN :tomorrow AND :limitDate')
->setParameter('true', true)
->setParameter('tomorrow', $tomorrow)
->setParameter('limitDate', $limitDate);
if ($level) {
if ($level == "beginner") {
$qb->andWhere('teacher.isBeginner = :true')
->setParameter('true', true);
}
if ($level == "intermediate") {
$qb->andWhere('teacher.isIntermediate = :true')
->setParameter('true', true);
}
if ($level == "advanced") {
$qb->andWhere('teacher.isAdvanced = :true')
->setParameter('true', true);
}
}
if ($isChild) {
if ($isChild == "1") {
$qb->andWhere('teacher.forChildren = :true')
->setParameter('true', true)
->andWhere('g.id = :feminin OR g.id= :masculin')
->setParameter('feminin', 2)
->setParameter('masculin', 1);
}
} else {
$qb->andWhere('g.id = :genderId')
->setParameter('genderId', $genderId);
}
$qb->orderBy('s.freeDate', 'ASC');
return $qb->getQuery()->getResult();
}
public function findTeachersWithFreeSchedulesByCategoryAndGenderForTickets($categoryNameId, $genderId)
{
$currentDate = new \DateTimeImmutable('03:00');
$tomorrow = $currentDate->modify('+1 day');
$limitDate = $currentDate->modify('+8 days');
return $this->createQueryBuilder('t')
->leftJoin('t.schedules', 's')
->leftJoin('s.scheduleInstitute', 's_si')
->leftJoin('t.teacherSubjects', 'ts')
->leftJoin('ts.subject', 'ts_s')
->leftJoin('ts_s.category', 'ts_s_c')
->leftJoin('t.categories', 'c')
->leftJoin('t.userId', 'userId')
->leftJoin('userId.gender', 'g')
->addSelect('s')
->addSelect('s_si')
->addSelect('ts')
->addSelect('ts_s', 'ts_s_c')
->addSelect('c')
->addSelect('userId')
->addSelect('g')
->andWhere('s.isFree = :true')
->andWhere('s.isBlocked = :false')
->setParameter('false', false)
->andWhere('s.isForLevelTest = :false')
->setParameter('false', false)
->andWhere('c.id = :categoryNameId')
->setParameter('categoryNameId', $categoryNameId)
->andWhere('g.id = :genderId')
->setParameter('genderId', $genderId)
->andWhere('s.freeDate BETWEEN :tomorrow AND :limitDate')
->setParameter('true', true)
->setParameter('tomorrow', $tomorrow)
->setParameter('limitDate', $limitDate)
->orderBy('s.freeDate', 'ASC')
->getQuery()
->getResult();
}
//For Level Test
public function findTeachersWithFreeSchedulesBySubjectAndGenderForTest($subjectId, $genderId, $limitDateRegistration)
{
$currentDate = new \DateTimeImmutable('03:00');
$tomorrow = $currentDate->modify('+1 day');
//$limitDate = $limitDateRegistration;
$limitDate = $currentDate->modify('+2 weeks');
return $this->createQueryBuilder('t')
->leftJoin('t.schedules', 's')
->leftJoin('s.scheduleInstitute', 's_si')
->leftJoin('t.teacherSubjects', 'ts')
->leftJoin('ts.subject', 'ts_s')
->leftJoin('ts_s.category', 'ts_s_c')
->leftJoin('t.categories', 'c')
->leftJoin('t.userId', 'userId')
->leftJoin('userId.gender', 'g')
->leftJoin('t.teacherLeveltests', 'teacherLeveltests')
->addSelect('s')
->addSelect('s_si')
->addSelect('ts')
->addSelect('ts_s', 'ts_s_c')
->addSelect('c')
->addSelect('userId')
->addSelect('g')
->addSelect('teacherLeveltests')
->andWhere('s.isFree = :true')
->andWhere('s.isBlocked = :false')
->setParameter('false', false)
->andWhere('teacherLeveltests.subject = :subjectId')
->setParameter('subjectId', $subjectId)
->andWhere('g.id = :genderId')
->setParameter('genderId', $genderId)
->andWhere('s.freeDate BETWEEN :tomorrow AND :limitDate')
->setParameter('true', true)
->setParameter('tomorrow', $tomorrow)
->setParameter('limitDate', $limitDate)
->orderBy('s.freeDate', 'ASC')
->getQuery()
->getResult();
}
public function findTeachersWithFreeSchedulesBySubjectAndGenderForTestForRamadan($subjectId, $genderId)
{
$currentDate = new \DateTimeImmutable('03:00');
$tomorrow = $currentDate->modify('+1 day');
$limitDate = $currentDate->modify('+2 weeks');
return $this->createQueryBuilder('t')
->leftJoin('t.schedules', 's')
->leftJoin('s.scheduleInstitute', 's_si')
->leftJoin('t.teacherSubjects', 'ts')
->leftJoin('ts.subject', 'ts_s')
->leftJoin('ts_s.category', 'ts_s_c')
->leftJoin('t.categories', 'c')
->leftJoin('t.userId', 'userId')
->leftJoin('userId.gender', 'g')
->leftJoin('t.teacherLeveltests', 'teacherLeveltests')
->addSelect('s')
->addSelect('s_si')
->addSelect('ts')
->addSelect('ts_s', 'ts_s_c')
->addSelect('c')
->addSelect('userId')
->addSelect('g')
->addSelect('teacherLeveltests')
->andWhere('s.isForLevelTest = :true')
->setParameter('true', true)
->andWhere('teacherLeveltests.subject = :subjectId')
->setParameter('subjectId', $subjectId)
->andWhere('g.id = :genderId')
->setParameter('genderId', $genderId)
->andWhere('s.freeDate BETWEEN :tomorrow AND :limitDate')
->setParameter('tomorrow', $tomorrow)
->setParameter('limitDate', $limitDate)
->orderBy('s.freeDate', 'ASC')
->getQuery()
->getResult();
}
public function findTeachersWithFreeSchedulesByCategoryAndGenderWithoutCurrentTeacher($categoryNameId, $genderId, $currentTeacher)
{
$currentDate = new \DateTimeImmutable('03:00');
$tomorrow = $currentDate->modify('+1 day');
$limitDate = $currentDate->modify('+8 days');
return $this->createQueryBuilder('teacher')
->leftJoin('teacher.schedules', 'schedules')
->leftJoin('teacher.teacherSubjects', 'teacher_subjects')
->leftJoin('teacher.categories', 'categories')
->leftJoin('teacher.userId', 'userId')
->leftJoin('userId.gender', 'gender')
->addSelect('schedules')
->addSelect('teacher_subjects')
->addSelect('categories')
->addSelect('userId')
->addSelect('gender')
->andWhere('schedules.isFree = :true')
->andWhere('schedules.forCatchUp = :false')
->setParameter('false', false)
->andWhere('schedules.isBlocked = :false')
->setParameter('false', false)
->andWhere('schedules.forVideo = :false')
->setParameter('false', false)
->andWhere('schedules.isForLevelTest = :false')
->setParameter('false', false)
->andWhere('categories.id = :categoryNameId')
->setParameter('categoryNameId', $categoryNameId)
->andWhere('gender.id = :genderId')
->setParameter('genderId', $genderId)
->andWhere('schedules.freeDate BETWEEN :tomorrow AND :limitDate')
->setParameter('true', true)
->andWhere('teacher != :currentTeacher')
->setParameter('currentTeacher', $currentTeacher)
->setParameter('tomorrow', $tomorrow)
->setParameter('limitDate', $limitDate)
->orderBy('schedules.freeDate', 'ASC')
->getQuery()
->getResult();
}
/*
public function findOneBySomeField($value): ?Teacher
{
return $this->createQueryBuilder('t')
->andWhere('t.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}