foreach();
This commit is contained in:
parent
7288baa959
commit
bb4fa52274
|
@ -61,6 +61,8 @@ class Query extends Component implements QueryInterface
|
||||||
*/
|
*/
|
||||||
public array $traversals = [];
|
public array $traversals = [];
|
||||||
|
|
||||||
|
public $foreach = [];
|
||||||
|
|
||||||
public $where = [];
|
public $where = [];
|
||||||
|
|
||||||
public $limit;
|
public $limit;
|
||||||
|
@ -351,6 +353,46 @@ class Query extends Component implements QueryInterface
|
||||||
return $prefix . $name;
|
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 $condition
|
||||||
* @param $params
|
* @param $params
|
||||||
|
@ -358,7 +400,6 @@ class Query extends Component implements QueryInterface
|
||||||
*/
|
*/
|
||||||
protected function genWhere($condition, array &$params)
|
protected function genWhere($condition, array &$params)
|
||||||
{
|
{
|
||||||
|
|
||||||
return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : '';
|
return ($where = $this->genCondition($condition, $params)) ? 'FILTER ' . $where : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +421,7 @@ class Query extends Component implements QueryInterface
|
||||||
/**
|
/**
|
||||||
* @todo Переписать под новую архитектуру
|
* @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, operand 1, operand 2, ...
|
||||||
|
|
||||||
$operator = strtoupper($condition[0]);
|
$operator = strtoupper($condition[0]);
|
||||||
|
@ -426,7 +467,11 @@ class Query extends Component implements QueryInterface
|
||||||
foreach ($value as $key => $value) {
|
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);
|
$this->filterHashCondition($key, $value, $params, $parts, $operator);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
|
return count($parts) === 1 ? $parts[0] : '(' . implode(') && (', $parts) . ')';
|
||||||
|
@ -467,6 +511,10 @@ class Query extends Component implements QueryInterface
|
||||||
|
|
||||||
// IN condition
|
// IN condition
|
||||||
$parts[] = $this->genInCondition('IN', [$column, $value], $params);
|
$parts[] = $this->genInCondition('IN', [$column, $value], $params);
|
||||||
|
} else if (is_int($column) && is_string($value)) {
|
||||||
|
// Передача без ключа массива (строка с готовым выражением)
|
||||||
|
|
||||||
|
$parts[] = $value;
|
||||||
} else {
|
} else {
|
||||||
// Правый операнд передан как строка (подразумевается)
|
// Правый операнд передан как строка (подразумевается)
|
||||||
|
|
||||||
|
@ -778,6 +826,7 @@ class Query extends Component implements QueryInterface
|
||||||
static::genFor($query->for ?? $query->collection),
|
static::genFor($query->for ?? $query->collection),
|
||||||
static::genIn($query->in ?? $query->collection, $query->traversals),
|
static::genIn($query->in ?? $query->collection, $query->traversals),
|
||||||
static::genLet($query->vars),
|
static::genLet($query->vars),
|
||||||
|
$this->genForeach($query->foreach),
|
||||||
$this->genWhere($query->where, $params),
|
$this->genWhere($query->where, $params),
|
||||||
isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null,
|
isset($this->search) ? $this->genSearch($this->search, $this->searchType) : null,
|
||||||
$this->genOrderBy($query->orderBy, $params),
|
$this->genOrderBy($query->orderBy, $params),
|
||||||
|
@ -1198,6 +1247,23 @@ class Query extends Component implements QueryInterface
|
||||||
return $this;
|
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
|
* @param array $expression
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue