diff --git a/mirzaev/yii2-arangodb/Query.php b/mirzaev/yii2-arangodb/Query.php index 63cc11e..49d549b 100644 --- a/mirzaev/yii2-arangodb/Query.php +++ b/mirzaev/yii2-arangodb/Query.php @@ -61,6 +61,8 @@ class Query extends Component implements QueryInterface */ public array $traversals = []; + public $foreach = []; + public $where = []; public $limit; @@ -351,6 +353,46 @@ class Query extends Component implements QueryInterface return $prefix . $name; } + /** + * Генерация AQL кода "FOR IN" + * + * @param $condition + * @param $params + * @return string + */ + protected function genForeach(array $conditions): ?string + { + // Инициализация + $aql = ''; + + foreach ($conditions as $condition) { + // Перебор выражений + + genForeach_recursion: + + foreach ($condition as $FOR => $IN) { + // Инициализация операндов + + if (is_int($FOR) && is_array($IN)) { + // Вложенный массив (неожиданные входные данные) + + // Реинициализация + $condition = $IN; + + // Перебор вложенного массива + goto genForeach_recursion; + } + + $aql .= "FOR $FOR IN $IN "; + } + } + + // Постобработка + $aql = trim($aql); + + return $aql; + } + /** * @param $condition * @param $params @@ -358,7 +400,6 @@ class Query extends Component implements QueryInterface */ protected function genWhere($condition, array &$params) { - return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : ''; } @@ -380,7 +421,7 @@ class Query extends Component implements QueryInterface /** * @todo Переписать под новую архитектуру */ - if (isset($condition[0]) && is_string($condition[0])) { + if (isset($condition[0]) && is_string($condition[0]) && count($condition) > 1) { // Формат: operator, operand 1, operand 2, ... $operator = strtoupper($condition[0]); @@ -426,7 +467,11 @@ class Query extends Component implements QueryInterface foreach ($value as $key => $value) { // Перебор выражений в сложном режиме - if (is_int($key) && is_array($value)) { + if (is_int($key) && is_string($value)) { + + // $key = $value; + // $value = null; + } else if (is_int($key) && is_array($value)) { // Многомерный массив // Рекурсивный поиск выражений @@ -451,7 +496,6 @@ class Query extends Component implements QueryInterface // Генерация $this->filterHashCondition($key, $value, $params, $parts, $operator); } - } return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')'; @@ -467,6 +511,10 @@ class Query extends Component implements QueryInterface // IN condition $parts[] = $this->genInCondition('IN', [$column, $value], $params); + } else if (is_int($column) && is_string($value)) { + // Передача без ключа массива (строка с готовым выражением) + + $parts[] = $value; } else { // Правый операнд передан как строка (подразумевается) @@ -778,6 +826,7 @@ class Query extends Component implements QueryInterface static::genFor($query->for ?? $query->collection), static::genIn($query->in ?? $query->collection, $query->traversals), static::genLet($query->vars), + $this->genForeach($query->foreach), $this->genWhere($query->where, $params), isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null, $this->genOrderBy($query->orderBy, $params), @@ -1198,6 +1247,23 @@ class Query extends Component implements QueryInterface return $this; } + /** + * Перебор + * + * FOR НАЗВАНИЕ IN ПЕРЕМЕННАЯ + * + * @param array $expression ['НАЗВАНИЕ' => 'ПЕРЕМЕННАЯ'] + */ + public function foreach(array $expression) + { + $this->foreach = match (true) { + empty($this->foreach) => [$expression], + default => $this->foreach []= [$expression] + }; + + return $this; + } + /** * @param array $expression */