<?php
namespace App\Controller\Admin\Filter;
use App\Entity\Admin;
use App\Entity\User;
use App\Entity\Mission;
use App\Entity\Service;
use App\Entity\Laboratoire;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Query\Expr\Join;
use phpDocumentor\Reflection\Types\Integer;
use Symfony\Component\Security\Core\Security;
use App\Form\Type\Admin\DateCalendarFilterType;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use Symfony\Component\HttpFoundation\Session\Session;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto;
use EasyCorp\Bundle\EasyAdminBundle\Filter\FilterTrait;
use Symfony\Component\Security\Core\User\UserInterface;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface;
use EasyCorp\Bundle\EasyAdminBundle\Form\Filter\Type\BooleanFilterType;
class RecapHoraireFilter implements FilterInterface
{
use FilterTrait;
private $userId;
public function setUserId($userId)
{
$this->userId = $userId;
return $this;
}
public function getUserId()
{
return $this->userId;
}
public static function new(string $propertyName, $label = null, $userId): self
{
return (new self())
->setUserId($userId)
->setFilterFqcn(__CLASS__)
->setProperty($propertyName)
->setLabel($label)
->setFormType(BooleanFilterType::class);
}
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void
{
// dd(sprintf('%s. = :userId', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty()));
if (true === $filterDataDto->getValue()) {
$queryBuilder
->innerJoin(Mission::class, 'mi', Join::WITH, $filterDataDto->getEntityAlias() . '.mission = mi')
->innerJoin(Service::class, 'se', Join::WITH, 'mi.service = se')
->innerJoin(Laboratoire::class, 'la', Join::WITH, 'se.laboratoire = la')
->innerJoin(Admin::class, 'a', Join::WITH, 'la.admin = a')
->andWhere('a.id = :userId')
->setParameter('userId', $this->getUserId());
} else {
$queryBuilder
->innerJoin(Mission::class, 'mi', Join::WITH, $filterDataDto->getEntityAlias() . '.mission = mi')
->innerJoin(Service::class, 'se', Join::WITH, 'mi.service = se')
->innerJoin(Laboratoire::class, 'la', Join::WITH, 'se.laboratoire = la')
->innerJoin(Admin::class, 'a', Join::WITH, 'la.admin = a')
->andWhere('a.id <> :userId')
->setParameter('userId', $this->getUserId());
}
// ...
}
}