Cakephp3: результат выполнения оператора CASE в строку, необходимо целое число - PullRequest
0 голосов
/ 27 апреля 2018

Я генерирую оператор case для возврата либо 0, либо 1:

$desc_case = $q->newExpr()
    ->addCase(
            [$q->newExpr()->add(["description IS" => NULL])],
            [0,1],
            ["integer","integer"]
            );
$q = $q->select(["has_desc" => $desc_case]);

Что приводит к следующему правильному SQL:

SELECT [fields removed for clarity], (CASE WHEN (description) IS NULL THEN :c0 ELSE :c1 END) AS `has_desc` FROM skills Skills

Я отключил увлажнение и получил результат с помощью

->hydrate(false)->toArray();

Результат оператора CASE возвращается в виде строки - либо «0», либо «1» - что нарушает логику в нисходящем направлении.

Я отследил исполняемый код как мог, и похоже, что CakePHP использует передаваемые имена типов для правильной привязки значений, но нигде тип не попадает в TypeMap, используемый для отображения выходных данных.

Простой обходной путь - настроить значения по факту (что я и делаю), но я бы хотел сделать эту работу в принципе, как и ожидалось ...:)

1 Ответ

0 голосов
/ 27 апреля 2018

Информация о типе, передаваемая в addCase(), предназначена только для ввода данных, т.е. переданные значения будут связаны как заданные типы. На возвращаемые значения, т.е. на значения, выбираемые с помощью скомпилированного оператора CASE, это никак не влияет.

Если вы хотите повлиять на тип, используемый для приведения выбранных значений столбцов, которые не существуют в схеме (обратите внимание, что изменение схемы также повлияет на другие части ORM и построителя запросов), тогда вам нужно изменить введите карту соответственно, например:

$query
    ->getSelectTypeMap()
    ->addDefaults([
        'has_desc' => 'integer'
    ]);

Смотри также

...