Spec-Zone.ru › CakePHP 4.3

Класс CaseStatementExpression

Представляет оператор SQL case с гибким API

Пространство имен: Cake\Database\Expression

Краткое описание свойств

  • $_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

Список имён типов

Возвращает

array

clause() 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 необязательный

Тип значения.

Возвращает

string

else() 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<string, string>

Получает типы по умолчанию для текущей карты типов.

Возвращает

array<string, string>

getReturnType() public

getReturnType(): string

Возвращает абстрактный тип, который вернёт это выражение.

Если тип не был явно задан с помощью setReturnType(), этот метод попытается получить тип из типов результатов вызовов then() и else(). Все типы должны быть идентичны, чтобы это работало, в противном случае тип по умолчанию будет string.

Возвращает

string

См. также

CaseStatementExpression::then()

getTypeMap() public

getTypeMap(): Cake\Database\TypeMap

Возвращает существующую карту типов.

Возвращает

Cake\Database\TypeMap

inferType() protected

inferType(mixed $value): string|null

Определяет абстрактный тип для данного значения.

Параметры

mixed $value

Значение, для которого требуется определить тип.

Возвращает

string|null

setDefaultTypes() public

setDefaultTypes(array<string, string> $types): $this

Перезаписывает сопоставления типов по умолчанию для полей в объекте-реализации.

Этот метод полезен, если вам нужно установить сопоставления типов, которые используются совместно несколькими функциями/выражениями в запросе.

Чтобы добавить значение по умолчанию без перезаписи существующих, используйте getTypeMap()->addDefaults()

Параметры

array<string, string> $types

Массив типов для установки.

Возвращает

$this

См. также

\Cake\Database\TypeMap::setDefaults()

setReturnType() public

setReturnType(string $type): $this

Устанавливает абстрактный тип, который вернёт это выражение.

Если тип не задан явно через этот метод, то метод getReturnType() попытается определить тип из типов результатов вызовов then() и else().

Параметры

string $type

Используемое имя типа.

Возвращает

$this

setTypeMap() public

setTypeMap(Cake\Database\TypeMap|array $typeMap): $this

Создаёт новую карту типов, если $typeMap является массивом, иначе обменивает её на заданную.

Параметры

Cake\Database\TypeMap|array $typeMap

Создаёт TypeMap, если массив, иначе устанавливает заданную TypeMap

Возвращает

$this

sql() public

sql(Cake\Database\ValueBinder $binder): string

Преобразует узел в фрагмент SQL-строки.

Параметры

Cake\Database\ValueBinder $binder

Возвращает

string

then() 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

Возвращает

$this

when() 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.3/class-Cake.Database.Expression.CaseStatementExpression.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API