PhalconRest\QueryParsers\PhqlQueryParser::applyQuery PHP Метод

applyQuery() публичный Метод

public applyQuery ( Phalcon\Mvc\Model\Query\Builder $builder, PhalconApi\Data\Query $query, ApiResource $resource )
$builder Phalcon\Mvc\Model\Query\Builder
$query PhalconApi\Data\Query
$resource PhalconRest\Api\ApiResource
    public function applyQuery(\Phalcon\Mvc\Model\Query\Builder $builder, Query $query, ApiResource $resource)
    {
        $from = $builder->getFrom();
        $fromString = is_array($from) ? array_keys($from)[0] : $from;
        if ($query->hasFields()) {
            $builder->columns($query->getFields());
        }
        if ($query->hasOffset()) {
            $builder->offset($query->getOffset());
        }
        if ($query->hasLimit()) {
            $builder->limit($query->getLimit());
        }
        if ($query->hasConditions()) {
            $conditions = $query->getConditions();
            $andConditions = [];
            $orConditions = [];
            /** @var Condition $condition */
            foreach ($conditions as $conditionIndex => $condition) {
                if ($condition->getType() == Condition::TYPE_AND) {
                    $andConditions[] = $condition;
                } else {
                    if ($condition->getType() == Condition::TYPE_OR) {
                        $orConditions[] = $condition;
                    }
                }
            }
            $allConditions = $orConditions + $andConditions;
            /** @var Condition $condition */
            foreach ($allConditions as $conditionIndex => $condition) {
                $operator = $this->getOperator($condition->getOperator());
                if (!$operator) {
                    continue;
                }
                $parsedValues = $this->parseValues($operator, $condition->getValue());
                $format = $this->getConditionFormat($operator);
                $valuesReplacementString = $this->getValuesReplacementString($parsedValues, $conditionIndex);
                $fieldString = sprintf('[%s].[%s]', $fromString, $condition->getField());
                $conditionString = sprintf($format, $fieldString, $operator, $valuesReplacementString);
                $bindValues = $this->getBindValues($parsedValues, $conditionIndex);
                switch ($condition->getType()) {
                    case Condition::TYPE_OR:
                        $builder->orWhere($conditionString, $bindValues);
                        break;
                    case Condition::TYPE_AND:
                    default:
                        $builder->andWhere($conditionString, $bindValues);
                        break;
                }
            }
        }
        if ($query->hasExcludes()) {
            $builder->notInWhere($fromString . '.' . $resource->getModelPrimaryKey(), $query->getExcludes());
        }
        if ($query->hasSorters()) {
            $sorters = $query->getSorters();
            /** @var Sorter $sorter */
            foreach ($sorters as $sorter) {
                switch ($sorter->getDirection()) {
                    case Sorter::DESCENDING:
                        $direction = 'DESC';
                        break;
                    case Sorter::ASCENDING:
                    default:
                        $direction = 'ASC';
                        break;
                }
                $fieldString = sprintf('[%s].[%s]', $fromString, $sorter->getField());
                $builder->orderBy($fieldString . ' ' . $direction);
            }
        }
    }