Я генерирую оператор 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, используемый для отображения выходных данных.
Простой обходной путь - настроить значения по факту (что я и делаю), но я бы хотел сделать эту работу в принципе, как и ожидалось ...:)