Select Cakephp 3子查询表达式

Select Cakephp 3子查询表达式,select,expression,conditional,query-builder,cakephp-3.x,Select,Expression,Conditional,Query Builder,Cakephp 3.x,我正在尝试创建基于类型字段的条件选择。为什么$exp->addCase()调用无效,并且它说addCase()是未知方法 $query->select(function ($exp) use ($query) { $concatPerson = $query->func()->concat(['lastname' => 'literal', ', ', 'firstnames' => 'literal']); return $exp->addC

我正在尝试创建基于类型字段的条件选择。为什么
$exp->addCase()
调用无效,并且它说
addCase()
是未知方法

$query->select(function ($exp) use ($query) {
    $concatPerson = $query->func()->concat(['lastname' => 'literal', ', ', 'firstnames' => 'literal']);
    return $exp->addCase(
        [
            $query->newExpr()->eq('type', 1),
            $query->newExpr()->eq('type', 2),
        ],
        [$concatPerson, 'business_name'],
        ['string', 'string']
    );
});

因为
select()
的可调用项与
where()
的可调用项的工作方式不同。调用
select()
的可调用项时,会将当前查询传递给它们(即您正在对查询对象调用
addCase()
),它们将返回要选择的字段列表

您尝试执行的操作需要直接将表达式对象传递给
select()
,如

$concatPerson = $query->func()->concat([
    'lastname' => 'literal', ', ', 'firstnames' => 'literal'
]);
$exp = $query->newExpr()->addCase(
    [
        $query->newExpr()->eq('type', 1),
        $query->newExpr()->eq('type', 2),
    ],
    [$concatPerson, 'business_name'],
    ['string', 'string']
);

$query->select(['field_alias' => $exp]);
另见