Skip to content

Commit ca9d111

Browse files
authored
[framework] admin: fixed flag filter in product advanced search (#2989)
1 parent 67aa8d5 commit ca9d111

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

src/Model/AdvancedSearch/Filter/ProductFlagFilter.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44

55
namespace Shopsys\FrameworkBundle\Model\AdvancedSearch\Filter;
66

7-
use Doctrine\ORM\Query\Expr\Join;
87
use Doctrine\ORM\QueryBuilder;
98
use Shopsys\FrameworkBundle\Model\AdvancedSearch\AdvancedSearchFilterInterface;
109
use Shopsys\FrameworkBundle\Model\Product\Flag\FlagFacade;
11-
use Shopsys\FrameworkBundle\Model\Product\Product;
10+
use Shopsys\FrameworkBundle\Model\Product\ProductDomain;
1211
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
1312

1413
class ProductFlagFilter implements AdvancedSearchFilterInterface
@@ -68,25 +67,33 @@ public function getValueFormOptions()
6867
*/
6968
public function extendQueryBuilder(QueryBuilder $queryBuilder, $rulesData)
7069
{
70+
$isFlags = [];
7171
$isNotFlags = [];
7272

73-
foreach ($rulesData as $index => $ruleData) {
73+
foreach ($rulesData as $ruleData) {
7474
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;
7976
} elseif ($ruleData->operator === self::OPERATOR_IS_NOT) {
8077
$isNotFlags[] = $ruleData->value;
8178
}
8279
}
8380

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+
8491
if (count($isNotFlags) === 0) {
8592
return;
8693
}
8794

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));
9097
$queryBuilder->setParameter('isNotFlags', $isNotFlags);
9198
}
9299
}

0 commit comments

Comments
 (0)