foreach();
This commit is contained in:
parent
7288baa959
commit
bb4fa52274
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue