/** * {@inheritdoc} */ public function generateCondition(ConditionInterface $condition, QueryBuilder $query, ShopContextInterface $context) { /** @var ProductAttributeCondition $condition */ if (!$condition->getField()) { throw new \Exception('ProductAttributeCondition class requires a defined attribute field!'); } if (!$condition->getOperator()) { throw new \Exception('ProductAttributeCondition class requires a defined operator!'); } $placeholder = ':' . $condition->getField(); $field = 'productAttribute.' . $condition->getField(); switch (true) { case $condition->getValue() === null: if ($condition->getOperator() === ProductAttributeCondition::OPERATOR_EQ) { $query->andWhere($field . ' IS NULL'); } else { $query->andWhere($field . ' IS NOT NULL'); } break; case $condition->getOperator() === ProductAttributeCondition::OPERATOR_IN: $query->andWhere($field . ' IN (' . $placeholder . ')'); $query->setParameter($placeholder, $condition->getValue(), Connection::PARAM_STR_ARRAY); break; case $condition->getOperator() === ProductAttributeCondition::OPERATOR_CONTAINS: $query->andWhere($field . ' LIKE ' . $placeholder); $query->setParameter($placeholder, '%' . $condition->getValue() . '%'); break; case $condition->getOperator() === ProductAttributeCondition::OPERATOR_BETWEEN: $value = $condition->getValue(); if (isset($value['min'])) { $query->andWhere($field . ' >= ' . $placeholder . 'Min')->setParameter($placeholder . 'Min', $value['min']); } if (isset($value['max'])) { $query->andWhere($field . ' <= ' . $placeholder . 'Max')->setParameter($placeholder . 'Max', $value['max']); } break; case $condition->getOperator() === ProductAttributeCondition::OPERATOR_STARTS_WITH: $query->andWhere($field . ' LIKE ' . $placeholder); $query->setParameter($placeholder, $condition->getValue() . '%'); break; case $condition->getOperator() === ProductAttributeCondition::OPERATOR_ENDS_WITH: $query->andWhere($field . ' LIKE ' . $placeholder); $query->setParameter($placeholder, '%' . $condition->getValue()); break; default: $query->andWhere($field . ' ' . $condition->getOperator() . ' ' . $placeholder); $query->setParameter($placeholder, $condition->getValue()); break; } }