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);
}
}
}