diff --git a/src/Controller/TimesheetAbstractController.php b/src/Controller/TimesheetAbstractController.php index 7ce421b1..db4991c1 100644 --- a/src/Controller/TimesheetAbstractController.php +++ b/src/Controller/TimesheetAbstractController.php @@ -84,10 +84,11 @@ abstract class TimesheetAbstractController extends AbstractController $query->setUser($this->getUser()); } - if ($query->hasTags()) { + $tags = $query->getTags(true); + if (!empty($tags)) { $query->setTags( new ArrayCollection( - $this->getDoctrine()->getRepository(Tag::class)->findIdsByTagNameList(implode(',', $query->getTags()->toArray())) + $this->getDoctrine()->getRepository(Tag::class)->findIdsByTagNameList(implode(',', $tags)) ) ); } diff --git a/src/Repository/Query/TimesheetQuery.php b/src/Repository/Query/TimesheetQuery.php index 47c0da37..48383efd 100644 --- a/src/Repository/Query/TimesheetQuery.php +++ b/src/Repository/Query/TimesheetQuery.php @@ -10,6 +10,7 @@ namespace App\Repository\Query; use App\Entity\Activity; +use App\Entity\Tag; use App\Entity\User; use App\Form\Model\DateRange; @@ -216,9 +217,22 @@ class TimesheetQuery extends ActivityQuery /** * @return iterable */ - public function getTags() + public function getTags($allowUnknown = false) { - return $this->tags; + if (empty($this->tags)) { + return []; + } + + $result = []; + + foreach ($this->tags as $tag) { + if (!$allowUnknown && $tag instanceof Tag && null === $tag->getId()) { + continue; + } + $result[] = $tag; + } + + return $result; } /** @@ -231,12 +245,4 @@ class TimesheetQuery extends ActivityQuery return $this; } - - /** - * @return bool - */ - public function hasTags() - { - return !empty($this->tags) && count($this->tags) > 0; - } } diff --git a/src/Repository/TimesheetRepository.php b/src/Repository/TimesheetRepository.php index 2e8da41c..a0dbce98 100644 --- a/src/Repository/TimesheetRepository.php +++ b/src/Repository/TimesheetRepository.php @@ -383,9 +383,10 @@ class TimesheetRepository extends AbstractRepository } } - if ($query->hasTags()) { - $qb->andWhere('tags.id IN (:tags)') - ->setParameter('tags', $query->getTags()->toArray()); + $tags = $query->getTags(); + if (!empty($tags)) { + $qb->andWhere($qb->expr()->isMemberOf(':tags', 't.tags')) + ->setParameter('tags', $query->getTags()); } return $this->getBaseQueryResult($qb, $query);