Класс CaseStatementExpression
Представляет оператор SQL case с гибким API
Краткое описание свойств
-
$_typeMap public @property
Cake\Database\TypeMapКарта типов для использования при использовании массива условий для значения
WHEN. -
$else protected
Cake\Database\ExpressionInterface|object|scalar|nullЗначение результата части else.
-
$elseType protected
string|nullТип результата части else.
-
$isSimpleVariant protected
boolЯвляется ли это простым выражением case.
-
$returnType protected
string|nullВозвращаемый тип.
-
$validClauseNames protected
array<string>Имена разделов, допустимых для использования с методом
clause(). -
$value protected
Cake\Database\ExpressionInterface|object|scalar|nullЗначение case.
-
$valueType protected
string|nullТип значения case.
-
$when protected
arrayCake\Database\Expression\WhenThenExpression>Выражения
WHEN ... THEN .... -
$whenBuffer protected
array|nullБуфер, хранящий значения и типы для использования с
then().
Краткое описание методов
-
__clone() public
Клонирует внутренние объекты выражений.
-
__construct() public
Конструктор.
-
_castToExpression() protected
Условно преобразует переданное значение в объект ExpressionInterface, если тип класса реализует ExpressionTypeInterface. В противном случае возвращает значение без изменений.
-
_requiresToExpressionCasting() protected
Возвращает массив типов, для которых значения должны быть преобразованы в выражения, из списка имён типов, переданных в качестве параметра.
-
clause() public
Возвращает доступные данные для данного раздела.
-
compileNullableValue() protected
Компилирует значение nullable в SQL.
-
else() public
Устанавливает значение результата
ELSE. -
getDefaultTypes() public
Получает значения по умолчанию для текущей карты типов.
-
getReturnType() public
Возвращает абстрактный тип, который будет возвращать это выражение.
-
getTypeMap() public
Возвращает существующую карту типов.
-
inferType() protected
Определяет абстрактный тип для данного значения.
-
setDefaultTypes() public
Перезаписывает сопоставления типов по умолчанию для полей в реализующем объекте.
-
setReturnType() public
Устанавливает абстрактный тип, который будет возвращать это выражение.
-
setTypeMap() public
Создаёт новую карту типов, если $typeMap является массивом, в противном случае меняет её на заданную.
-
sql() public
Преобразует узел в фрагмент SQL-строки.
-
then() public
Устанавливает значение результата
THENдля последнего оператораWHEN ... THEN ..., который был открыт с помощьюwhen(). -
traverse() public
Итерирует по каждой части выражения рекурсивно для каждого уровня дерева выражений и выполняет вызов $callback, передавая в качестве первого параметра экземпляр выражения, который в данный момент итерируется.
-
when() public
Устанавливает значение
WHENдля выраженияWHEN ... THEN ..., или самодостаточное выражение, содержащее значение дляWHENи значение дляTHEN.
Подробное описание методов
__clone() public
__clone(): void
Клонирует внутренние объекты выражений.
Возвращает
void__construct() public
__construct(Cake\Database\ExpressionInterface|object|scalar|null $value = null, string|null $type = null)
Конструктор.
При установке значения генерируется синтаксис CASE case_value WHEN when_value ... END (простой случай), где when_value сравниваются с case_value.
При отсутствии значения генерируется синтаксис CASE WHEN when_conditions ... END (случай поиска), где условия содержат сравнения.
Обратите внимание, что null является допустимым значением случая и, следовательно, должно передаваться только в том случае, если вы действительно хотите создать вариант выражения простого случая!
Параметры
-
Cake\Database\ExpressionInterface|object|scalar|null$value необязательный Значение случая.
-
string|null$type необязательный Тип значения случая. Если тип не указан, будет предпринята попытка определить тип из значения.
_castToExpression() protected
_castToExpression(mixed $value, string|null $type = null): mixed
Условно преобразует переданное значение в объект ExpressionInterface, если класс типа реализует ExpressionTypeInterface. В противном случае возвращает значение без изменений.
Параметры
-
mixed$value Значение для преобразования в ExpressionInterface
-
string|null$type необязательный Имя типа
Возвращает
mixed_requiresToExpressionCasting() protected
_requiresToExpressionCasting(array $types): array
Возвращает массив с типами, для которых значения должны быть преобразованы в выражения из списка имен типов, переданных в качестве параметра.
Параметры
-
array$types Список имён типов
Возвращает
arrayclause() public
clause(string $clause): Cake\Database\ExpressionInterface|object|arrayCake\Database\Expression\WhenThenExpression>|scalar|null
Возвращает доступные данные для заданного условия.
Доступные условия
Доступны следующие имена условий:
-
value: Значение случая для выраженияCASE case_value WHEN .... -
when: Массив выраженийWHEN ... THEN .... -
else: Значение результатаELSE.
Параметры
-
string$clause Имя условия, которое требуется получить.
Возвращает
Cake\Database\ExpressionInterface|object|arrayCake\Database\Expression\WhenThenExpression>|scalar|nullИсключения
InvalidArgumentExceptionВ случае неверного имени условия.
compileNullableValue() protected
compileNullableValue(Cake\Database\ValueBinder $binder, Cake\Database\ExpressionInterface|object|scalar|null $value, string|null $type = null): string
Компилирует значение NULL в SQL.
Параметры
-
Cake\Database\ValueBinder$binder Используемый связующий объект значения.
-
Cake\Database\ExpressionInterface|object|scalar|null$value Значение для компиляции.
-
string|null$type необязательный Тип значения.
Возвращает
stringelse() public
else(Cake\Database\ExpressionInterface|object|scalar|null $result, string|null $type = null): $this
Устанавливает значение результата ELSE.
Параметры
-
Cake\Database\ExpressionInterface|object|scalar|null$result Значение результата.
-
string|null$type необязательный Тип результата. Если тип не указан, будет предпринята попытка определить тип из значения.
Возвращает
$thisИсключения
LogicExceptionВ случае, если требуется вызов закрывающего `then()`, прежде чем вызывать этот метод.
InvalidArgumentExceptionВ случае, если аргумент `$result` не является ни скалярным значением, ни объектом, экземпляром `\Cake\Database\ExpressionInterface`, или `null`.
getDefaultTypes() public
getDefaultTypes(): array<int|string, string>
Получает типы по умолчанию для текущей карты типов.
Возвращает
array<int|string, string>getReturnType() public
getReturnType(): string
Возвращает абстрактный тип, который вернёт это выражение.
Если тип не был явно задан с помощью setReturnType(), этот метод попытается получить тип из типов результатов вызовов then() и else(). Все типы должны быть идентичны, чтобы это работало, в противном случае тип по умолчанию будет string.
Возвращает
stringСм. также
getTypeMap() public
getTypeMap(): Cake\Database\TypeMap
Возвращает существующую карту типов.
Возвращает
Cake\Database\TypeMapinferType() protected
inferType(mixed $value): string|null
Определяет абстрактный тип для данного значения.
Параметры
-
mixed$value Значение, для которого требуется определить тип.
Возвращает
string|nullsetDefaultTypes() public
setDefaultTypes(array<int|string, string> $types): $this
Перезаписывает сопоставления типов по умолчанию для полей в объекте-реализации.
Этот метод полезен, если вам нужно установить сопоставления типов, которые используются совместно несколькими функциями/выражениями в запросе.
Чтобы добавить значение по умолчанию без перезаписи существующих, используйте getTypeMap()->addDefaults()
Параметры
-
array<int|string, string>$types Массив типов для установки.
Возвращает
$thisСм. также
setReturnType() public
setReturnType(string $type): $this
Устанавливает абстрактный тип, который вернёт это выражение.
Если тип не задан явно через этот метод, то метод getReturnType() попытается определить тип из типов результатов вызовов then() и else().
Параметры
-
string$type Используемое имя типа.
Возвращает
$thissetTypeMap() public
setTypeMap(Cake\Database\TypeMap|array $typeMap): $this
Создаёт новую карту типов, если $typeMap является массивом, иначе обменивает её на заданную.
Параметры
-
Cake\Database\TypeMap|array$typeMap Создаёт TypeMap, если массив, иначе устанавливает заданную TypeMap
Возвращает
$thissql() public
sql(Cake\Database\ValueBinder $binder): string
Преобразует узел в фрагмент SQL-строки.
Параметры
-
Cake\Database\ValueBinder$binder
Возвращает
stringthen() public
then(Cake\Database\ExpressionInterface|object|scalar|null $result, string|null $type = null): $this
Устанавливает значение результата THEN для последнего условия WHEN ... THEN ... , которое было открыто с помощью when().
Синтаксис на основе порядка
Этот метод может быть вызван только в случае, если when() ранее использовался со значением, отличным от замыкания или экземпляра \Cake\Database\Expression\WhenThenExpression:
$case
->when(['Table.column' => true])
->then('Yes')
->when(['Table.column' => false])
->then('No')
->else('Maybe'); Следующие варианты приведут к ошибке:
$case
->when(['Table.column' => true])
->when(['Table.column' => false])
// ... $case
->when(['Table.column' => true])
->else('Maybe')
// ... $case
->then('Yes')
// ... $case
->when(['Table.column' => true])
->then('Yes')
->then('No')
// ... Параметры
-
Cake\Database\ExpressionInterface|object|scalar|null$result Значение результата.
-
string|null$type необязательный Тип результата. Если тип не указан, будет предпринята попытка определить тип из значения.
Возвращает
$thisИсключения
LogicExceptionВ случае, если `when()` ранее не вызывался со значением, отличным от замыкания или экземпляра `\Cake\Database\Expression\WhenThenExpression`.
traverse() public
traverse(Closure $callback): $this
Рекурсивно перебирает каждую часть выражения на каждом уровне дерева выражений и выполняет вызов $callback, передавая в качестве первого параметра экземпляр текущего выражения.
Параметры
-
Closure$callback
Возвращает
$thiswhen() public
when(Cake\Database\ExpressionInterfaceClosure|object|array|scalar $when, array<string, string>|string|null $type = null): $this
Устанавливает значение WHEN для выражения WHEN ... THEN ..., или самодостаточного выражения, содержащего значение для WHEN и значение для THEN.
Синтаксис на основе порядка
При передаче значения, отличного от самодостаточного \Cake\Database\Expression\WhenThenExpression, экземпляра, оператор WHEN ... THEN ... должен быть закрыт вызовом then() перед повторным вызовом when() или else():
$queryExpression
->case($query->identifier('Table.column'))
->when(true)
->then('Yes')
->when(false)
->then('No')
->else('Maybe'); Самодостаточные выражения
При передаче экземпляра \Cake\Database\Expression\WhenThenExpression, будь то напрямую или через вызываемую функцию, нет необходимости закрывать этот объект с помощью then(), вместо этого оператор будет закрыт для объекта \Cake\Database\Expression\WhenThenExpression с помощью \Cake\Database\Expression\WhenThenExpression::then().
Вызываемые функции будут получать экземпляр \Cake\Database\Expression\WhenThenExpression, и должны возвращать один, будь то тот же объект или настраиваемый:
$queryExpression
->case()
->when(function (\Cake\Database\Expression\WhenThenExpression $whenThen) {
return $whenThen
->when(['Table.column' => true])
->then('Yes');
})
->when(function (\Cake\Database\Expression\WhenThenExpression $whenThen) {
return $whenThen
->when(['Table.column' => false])
->then('No');
})
->else('Maybe'); Обработка типов
Типы, предоставленные через аргумент $type , будут объединены с картой типов, установленной для этого выражения. При использовании вызываемых функций для $when, экземпляр \Cake\Database\Expression\WhenThenExpression , полученный вызываемыми функциями, унаследует эту карту типов, однако переданные здесь типы не будут объединены в случае использования вызываемых функций, вместо этого типы должны быть переданы в \Cake\Database\Expression\WhenThenExpression::when():
$queryExpression
->case()
->when(function (\Cake\Database\Expression\WhenThenExpression $whenThen) {
return $whenThen
->when(['unmapped_column' => true], ['unmapped_column' => 'bool'])
->then('Yes');
})
->when(function (\Cake\Database\Expression\WhenThenExpression $whenThen) {
return $whenThen
->when(['unmapped_column' => false], ['unmapped_column' => 'bool'])
->then('No');
})
->else('Maybe'); Безопасность пользовательских данных
При передаче пользовательских данных, помните, что разрешение передачи массива, определенного пользователем, представляет собой потенциальную уязвимость SQL-инъекции, поскольку это позволяет проникать необработанному SQL!
Следующее использование небезопасно и должно быть избегаемо:
$case
->when($userData) Безопасным вариантом для вышеуказанного будет определение единственного типа для значения:
$case
->when($userData, 'integer') Таким образом, при передаче массива для значения будет генерироваться исключение, предотвращая проникновение необработанного SQL, и все другие типы значений будут принудительно связаны как целые числа.
Другой способ безопасно передать пользовательские данные — при использовании массива условий и передача пользовательских данных только со стороны значений записей массива, что приведет к их привязке:
$case
->when([
'Table.column' => $userData,
]) Наконец, данные также можно привязать вручную:
$query
->select([
'val' => $query->newExpr()
->case()
->when($query->newExpr(':userData'))
->then(123)
])
->bind(':userData', $userData, 'integer') Параметры
-
Cake\Database\ExpressionInterfaceClosure|object|array|scalar$when Значение
WHEN. При использовании массива условий он должен быть совместим с\Cake\Database\Query::where(). Обратите внимание, что этот аргумент не полностью безопасен для использования с пользовательскими данными, так как массив, предоставленный пользователем, позволит проникать необработанному SQL! Если вы планируете использовать пользовательские данные, передайте единственный тип для аргумента$type(что принуждает значение$whenк не-массиву, а затем всегда связывает данные), используйте массив условий, где пользовательские данные передаются только со стороны значений записей массива, или пользовательские привязки!-
array<string, string>|string|null$type optional Тип значения when. Ассоциативный массив при использовании условий в стиле массива, или строка. Если тип не указан, тип будет пытаться определить по значению.
Возвращает
$thisВыбрасывает
LogicExceptionВ случае, если требуется вызов `then()`.
LogicExceptionВ случае, если вызываемая функция не возвращает экземпляр `\Cake\Database\Expression\WhenThenExpression`.
Подробное описание свойств
$_typeMap public @property
Карта типов для использования при использовании массива условий для значения WHEN.
Тип
Cake\Database\TypeMap$else protected
Значение результата else.
Тип
Cake\Database\ExpressionInterface|object|scalar|null$elseType protected
Тип результата else.
Тип
string|null$isSimpleVariant protected
Является ли это простым вариантом выражения.
Тип
bool$returnType protected
Возвращаемый тип.
Тип
string|null$validClauseNames protected
Названия положений, которые допустимы для использования с методом clause().
Тип
array<string>$value protected
Значение выражения case.
Тип
Cake\Database\ExpressionInterface|object|scalar|null$valueType protected
Тип значения case.
Тип
string|null$when protected
Выражения WHEN ... THEN ....
Тип
arrayCake\Database\Expression\WhenThenExpression>$whenBuffer protected
Буфер, содержащий значения и типы для использования с then().
Тип
array|null
© 2005–present The Cake Software Foundation, Inc.
Licensed under the MIT License.
CakePHP is a registered trademark of Cake Software Foundation, Inc.
We are not endorsed by or affiliated with CakePHP.
https://api.cakephp.org/4.4/class-Cake.Database.Expression.CaseStatementExpression.html