|
4 | 4 |
|
5 | 5 | namespace Shopsys\FrameworkBundle\Model\AdvancedSearch\Filter; |
6 | 6 |
|
7 | | -use Doctrine\ORM\Query\Expr\Join; |
8 | 7 | use Doctrine\ORM\QueryBuilder; |
9 | 8 | use Shopsys\FrameworkBundle\Model\AdvancedSearch\AdvancedSearchFilterInterface; |
10 | 9 | use Shopsys\FrameworkBundle\Model\Product\Flag\FlagFacade; |
11 | | -use Shopsys\FrameworkBundle\Model\Product\Product; |
| 10 | +use Shopsys\FrameworkBundle\Model\Product\ProductDomain; |
12 | 11 | use Symfony\Component\Form\Extension\Core\Type\ChoiceType; |
13 | 12 |
|
14 | 13 | class ProductFlagFilter implements AdvancedSearchFilterInterface |
@@ -68,25 +67,33 @@ public function getValueFormOptions() |
68 | 67 | */ |
69 | 68 | public function extendQueryBuilder(QueryBuilder $queryBuilder, $rulesData) |
70 | 69 | { |
| 70 | + $isFlags = []; |
71 | 71 | $isNotFlags = []; |
72 | 72 |
|
73 | | - foreach ($rulesData as $index => $ruleData) { |
| 73 | + foreach ($rulesData as $ruleData) { |
74 | 74 | if ($ruleData->operator === self::OPERATOR_IS) { |
75 | | - $tableAlias = 'f' . $index; |
76 | | - $flagParameter = 'flag' . $index; |
77 | | - $queryBuilder->join('p.flags', $tableAlias, Join::WITH, $tableAlias . '.id = :' . $flagParameter); |
78 | | - $queryBuilder->setParameter($flagParameter, $ruleData->value); |
| 75 | + $isFlags[] = $ruleData->value; |
79 | 76 | } elseif ($ruleData->operator === self::OPERATOR_IS_NOT) { |
80 | 77 | $isNotFlags[] = $ruleData->value; |
81 | 78 | } |
82 | 79 | } |
83 | 80 |
|
| 81 | + if (count($isFlags) + count($isNotFlags) === 0) { |
| 82 | + return; |
| 83 | + } |
| 84 | + |
| 85 | + if (count($isFlags) > 0) { |
| 86 | + $subQuery = 'SELECT IDENTITY(pdSub.product) FROM ' . ProductDomain::class . ' pdSub JOIN pdSub.flags AS fSub WHERE fSub.id IN (:isFlags)'; |
| 87 | + $queryBuilder->andWhere($queryBuilder->expr()->in('p.id', $subQuery)); |
| 88 | + $queryBuilder->setParameter('isFlags', $isFlags); |
| 89 | + } |
| 90 | + |
84 | 91 | if (count($isNotFlags) === 0) { |
85 | 92 | return; |
86 | 93 | } |
87 | 94 |
|
88 | | - $subQuery = 'SELECT flag_p.id FROM ' . Product::class . ' flag_p JOIN flag_p.flags _f WITH _f.id IN (:isNotFlags)'; |
89 | | - $queryBuilder->andWhere('p.id NOT IN (' . $subQuery . ')'); |
| 95 | + $subQuery = 'SELECT IDENTITY(pdSubNot.product) FROM ' . ProductDomain::class . ' pdSubNot JOIN pdSubNot.flags AS fSubNot WHERE fSubNot.id IN (:isNotFlags)'; |
| 96 | + $queryBuilder->andWhere($queryBuilder->expr()->notIn('p.id', $subQuery)); |
90 | 97 | $queryBuilder->setParameter('isNotFlags', $isNotFlags); |
91 | 98 | } |
92 | 99 | } |
0 commit comments