- Модуль: 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;
}