ProductRepository::buildCriteriaForTypeAttributes PHP Method

buildCriteriaForTypeAttributes() protected method

protected buildCriteriaForTypeAttributes ( array $typeSearchAttributes ) : CDbCriteria
$typeSearchAttributes array
return CDbCriteria
    protected function buildCriteriaForTypeAttributes(array $typeSearchAttributes)
    {
        $criteria = new CDbCriteria();
        $criteria->params = [];
        $i = 0;
        foreach ($typeSearchAttributes as $attribute => $params) {
            if (empty($params['value'])) {
                continue;
            }
            $alias = "attributes_values_{$i}";
            $criteria->join .= " JOIN {{store_product_attribute_value}} {$alias} ON t.id = {$alias}.product_id ";
            //@TODO подумать как улучшить
            if (is_array($params['value'])) {
                if (isset($params['value']['from'], $params['value']['to'])) {
                    $between = new CDbCriteria();
                    $between->addBetweenCondition("{$alias}." . $params['column'], $params['value']['from'], $params['value']['to']);
                    $between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
                    $between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
                    $criteria->mergeWith($between);
                } elseif (isset($params['value']['from']) && !isset($params['value']['to'])) {
                    $between = new CDbCriteria();
                    $between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
                    $between->addCondition("{$alias}.{$params['column']} >= :attr_{$i}");
                    $between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
                    $between->params[":attr_{$i}"] = $params['value']['from'];
                    $criteria->mergeWith($between);
                } elseif (isset($params['value']['to']) && !isset($params['value']['from'])) {
                    $between = new CDbCriteria();
                    $between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
                    $between->addCondition("{$alias}.{$params['column']} <= :attr_{$i}");
                    $between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
                    $between->params[":attr_{$i}"] = $params['value']['to'];
                    $criteria->mergeWith($between);
                } else {
                    $in = new CDbCriteria();
                    $in->addInCondition("{$alias}." . $params['column'], $params['value']);
                    $criteria->mergeWith($in);
                }
            } else {
                $condition = new CDbCriteria();
                $condition->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
                $condition->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
                $condition->addColumnCondition(["{$alias}." . $params['column'] => $params['value']]);
                $criteria->mergeWith($condition);
            }
            $i++;
        }
        return $criteria;
    }