• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/volume/queryhelper.php
  • Класс: BitrixDiskVolumeQueryHelper
  • Вызов: QueryHelper::prepareWhere
static function prepareWhere(array $filterFields, array $filterAlias = []): string
{
	$sqlHelper = Application::getConnection()->getSqlHelper();

	$where = [];
	$logic = 'AND';

	foreach ($filterFields as $key => $val)
	{
		if ($key === 'LOGIC')
		{
			$logic = $val;
			continue;
		}
		$operator = '=';
		if (!is_numeric($key))
		{
			if (preg_match("/^([=<>!@%]+)([^=<>!@%]+)$/", $key, $parts))
			{
				list(, $operator, $key) = $parts;
			}
			if (is_array($val) && !isset($val['LOGIC']))
			{
				if ($operator === '=')
				{
					$operator = '@';
				}
				elseif ($operator === '!')
				{
					$operator = '!@';
				}
			}
			if (isset($filterAlias[$key]))
			{
				$key = $filterAlias[$key];
			}
		}
		switch ($operator)
		{
			case '!':
				$where[] = "$key != '". $sqlHelper->forSql($val). "'";
				break;

			case '%':
				$where[] = "$key LIKE '%". $sqlHelper->forSql($val). "%'";
				break;

			case '!%':
				$where[] = "$key NOT LIKE '%". $sqlHelper->forSql($val). "%'";
				break;

			case '@':
			{
				if (is_array($val) && count($val) > 0)
				{
					$val = array_map([$sqlHelper, 'forSql'], $val);
					$where[] = "$key IN('".implode("', '", $val)."')";
				}
				elseif (is_string($val) && $val <> '')
				{
					$where[] = "$key IN(".$val.')';
				}
				break;
			}

			case '!@':
			{
				if (is_array($val) && count($val) > 0)
				{
					$val = array_map([$sqlHelper, 'forSql'], $val);
					$where[] = "$key NOT IN('".implode("', '", $val)."')";
				}
				elseif (is_string($val) && $val <> '')
				{
					$where[] = "$key NOT IN(".$val.')';
				}
				break;
			}

			default:
			{
				if (is_array($val))// && isset($val['LOGIC']))// && $val['LOGIC'] === 'OR')// OR condition
				{
					$subLogic = 'AND';
					if (isset($val['LOGIC']) && $val['LOGIC'] === 'OR')
					{
						$subLogic = 'OR';
						unset($val['LOGIC']);
					}

					$condition = [];
					foreach ($val as $k => $v)
					{
						$subOperator = '=';
						if (preg_match("/^([=<>!@%]+)([^=<>!@%]+)$/", $k, $parts))
						{
							list(, $subOperator, $k) = $parts;
						}
						if (isset($filterAlias[$k]))
						{
							$k = $filterAlias[$k];
						}
						switch ($subOperator)
						{
							case '!':
								$condition[] = "$k != '".$sqlHelper->forSql($v)."'";
								break;
							case '%':
								$condition[] = "$k LIKE '%".$sqlHelper->forSql($v)."%'";
								break;
							case '!%':
								$condition[] = "$k NOT LIKE '%".$sqlHelper->forSql($v)."%'";
								break;
							default:
								$condition[] = "$k $subOperator '".$sqlHelper->forSql($v)."'";
						}
					}
					$where[] = '('.implode(" $subLogic ", $condition).')';
				}
				else
				{
					$where[] = "$key $operator '".$sqlHelper->forSql($val)."'";
				}
				break;
			}
		}
	}

	$whereSql = '';
	if (count($where))
	{
		$whereSql = ' '.implode(" $logic ", $where);
	}

	return $whereSql;
}