src/App/Doctrine/Repository/Content/ObjectRepository.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Doctrine\Repository\Content;
  3. use App\Doctrine\Repository\SearchableRepositoryInterface;
  4. use App\Doctrine\Repository\SearchableRepositoryTrait;
  5. use App\Doctrine\Repository\System\SchoolRepository;
  6. use App\Entity\Content\AbstractObject;
  7. use App\Entity\Feed\AbstractEntry;
  8. use App\Entity\System\School;
  9. use App\Model\Searching\AbstractSearch;
  10. use App\Util\Querying;
  11. use Cms\ContainerBundle\Entity\Container;
  12. use Doctrine\ORM\EntityRepository;
  13. use Doctrine\ORM\QueryBuilder;
  14. use Platform\SecurityBundle\Entity\Identity\Account;
  15. /**
  16.  * @method AbstractObject find($id, $lockMode = null, $lockVersion = null)
  17.  * @method array|AbstractObject[] findAll()
  18.  * @method array|AbstractObject[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  19.  * @method AbstractObject findOneBy(array $criteria, array $orderBy = null)
  20.  */
  21. class ObjectRepository extends EntityRepository implements SearchableRepositoryInterface
  22. {
  23.     use SearchableRepositoryTrait;
  24.     /**
  25.      * {@inheritDoc}
  26.      * @param ObjectSearch $search
  27.      */
  28.     public function qbBySearch(
  29.         AbstractSearch $search,
  30.         ?QueryBuilder $qb null
  31.     ): QueryBuilder
  32.     {
  33.         if ( ! $search instanceof ObjectSearch) {
  34.             throw new \LogicException();
  35.         }
  36.         $repo $this->getEntityManager()->getRepository($this->_entityName);
  37.         if ( ! $repo instanceof self) {
  38.             throw new \RuntimeException();
  39.         }
  40.         $qb $qb ?: $repo->createQueryBuilder('objects');
  41.         if ($this->_entityName === AbstractObject::class && $search->getTypes()) {
  42.             $qb->andWhere(sprintf(
  43.                 'objects INSTANCE OF (%s)',
  44.                 implode(', '$search->getTypes())
  45.             ));
  46.         }
  47.         if ($search->getVisibility()) {
  48.             $qb
  49.                 ->andWhere('objects.visibility = :visibility')
  50.                 ->setParameter('visibility'$search->getVisibility());
  51.         }
  52.         $search->filterCutoff($qb);
  53.         $search->filterWindow($qb);
  54.         if ($lookup $search->getLookup()) {
  55.             $qb
  56.                 ->andWhere($qb->expr()->orX(
  57.                     Querying::dqlLike('objects.headline LIKE :lookup')
  58.                 ))
  59.                 ->setParameter('lookup'Querying::likeAny($lookup));
  60.         }
  61.         if (
  62.             in_array($search->getFilter(), [ObjectSearch::FILTERS__MY_DRAFTObjectSearch::FILTERS__MY_PUBLISHED], true) &&
  63.             $search->getAccount() instanceof Account
  64.         ) {
  65.             $qb
  66.                 ->andWhere(
  67.                     $qb->expr()->orX(
  68.                         $qb->expr()->eq('objects.touchedBy'$search->getAccount()->getId()),
  69.                         $qb->expr()->andX(
  70.                             $qb->expr()->isNull('objects.touchedBy'),
  71.                             $qb->expr()->eq('objects.updatedBy'$search->getAccount()->getId())
  72.                         ),
  73.                         $qb->expr()->andX(
  74.                             $qb->expr()->isNull('objects.touchedBy'),
  75.                             $qb->expr()->isNull('objects.updatedBy'),
  76.                             $qb->expr()->eq('objects.createdBy'$search->getAccount()->getId())
  77.                         )
  78.                     )
  79.                 )
  80.             ;
  81.         }
  82.         if (in_array($search->getFilter(), [ObjectSearch::FILTERS__MY_DRAFTObjectSearch::FILTERS__DRAFT], true)) {
  83.             $qb
  84.                 ->andWhere('objects.visibility != :visibility')
  85.                 ->setParameter('visibility'AbstractEntry::VISIBILITIES__PUBLISHED);
  86.         }
  87.         if (in_array($search->getFilter(), [ObjectSearch::FILTERS__MY_PUBLISHEDObjectSearch::FILTERS__PUBLISHED], true)) {
  88.             $qb
  89.                 ->andWhere('objects.visibility = :visibility')
  90.                 ->setParameter('visibility'AbstractEntry::VISIBILITIES__PUBLISHED);
  91.         }
  92.         if ($search->getContainer() instanceof Container) {
  93.             /** @var SchoolRepository $schoolRepository */
  94.             $schoolRepository $this->getEntityManager()->getRepository(School::class);
  95.             $school $schoolRepository->findOneBy(['department' => $search->getContainer()]);
  96.             $schoolType = ($school instanceof School) ? $school->getType() : 0;
  97.             if ($search->isDeep()) {
  98.                 $qb
  99.                     ->leftJoin('objects.department''departments')
  100.                     ->addSelect('departments')
  101.                     ->andWhere(
  102.                         $qb->expr()->orX(
  103.                             $qb->expr()->andX(
  104.                                 $qb->expr()->eq('departments.rt'':rt'),
  105.                                 $qb->expr()->gte('departments.lft'':lft'),
  106.                                 $qb->expr()->lte('departments.rgt'':rgt'),
  107.                             ),
  108.                             $qb->expr()->gt('BIT_AND(objects.schoolTypes, :schoolType)'0),
  109.                         )
  110.                     )
  111.                     ->setParameter('rt'$search->getContainer()->getRoot())
  112.                     ->setParameter('lft'$search->getContainer()->getLeft())
  113.                     ->setParameter('rgt'$search->getContainer()->getRight())
  114.                     ->setParameter('schoolType'$schoolType)
  115.                 ;
  116.             } else {
  117.                 $qb
  118.                     ->andWhere(
  119.                         $qb->expr()->orX(
  120.                             $qb->expr()->eq('objects.department'':department'),
  121.                             $qb->expr()->gt('BIT_AND(objects.schoolTypes, :schoolType)'0),
  122.                         )
  123.                     )
  124.                     ->setParameter('department'$search->getContainer())
  125.                     ->setParameter('schoolType'$schoolType)
  126.                 ;
  127.             }
  128.         }
  129.         if ($search->getChannels()) {
  130.             $qb
  131.                 ->andWhere('BIT_AND(objects.channels, :channels) = :channels')
  132.                 ->setParameter('channels'$search->getChannels());
  133.         }
  134.         switch ($search->getSort()) {
  135.             case ObjectSearch::SORTS__NAME:
  136.                 $qb
  137.                     ->addOrderBy('objects.headline'$search->getDirection());
  138.                 break;
  139.             case ObjectSearch::SORTS__TIMESTAMP:
  140.                 $qb
  141.                     ->addOrderBy('objects.touchedAt'$search->getDirection())
  142.                     ->addOrderBy('objects.headline''ASC');
  143.                 break;
  144.         }
  145.         return $qb;
  146.     }
  147. }