

kbn、nameはカラム名なんですが、 `|| name`
の部分が文字列として認識されテーブルのカラム名として認識してほしいのですが、どのように記述すればよいのでしょうか？

SQL文

[code]

    select 
     case when kbn = '1' then '1' || name 
     else '2' 
     end username 
    from user;
    
[/code]

CakePHP

[code]

    $username = $query->newExpr()->addCase(
                    [$subquery->newExpr()->add(['kbn' => '1')],
                    ["'1' || name" ,new IdentifierExpression('2')],
                    ['string', 'string']
                );
    
[/code]


CC BY-SA 4.0
2022-12-06T07:13:27.370
92600
2022-12-12T05:13:06.683
2022-12-07T00:06:42.750
55476
55476
question
cakephp
CakePHPのSQLのCase文でカラム名の追加方法


'1', '2' となっている部分が外部入力値でなければ、newExprでSQLをそのまま書いてよいと思います。  
（SQLインジェクションが発生しない前提）

[code]

    $expr = $query->newExpr("case when kbn = '1' then '1' || name else '2' end");
    $query->select(['username' => $expr]);
    
[/code]

外部入力の可能性があるなら、SQLインジェクションを考慮して値をバインドするようにメソッドで組立てます。

[code]

    $expr = $query->newExpr()->addCase(
        $query->newExpr()->eq('kbn', '1'),
        [
            $query->func()->concat(['1', $query->identifier('name')]),
            '2',
        ],
        ['string', 'string']
    );
    $query->select(['username' => $expr]);
    
[/code]

`IdentifierExpression` は、テーブルのフィールド名などの識別子を指定する時に使用します。  
`$query->identifier('field_name')` は、 `new IdentifierExpression('field_name')`
のシノニムになります。

[式の中で識別子を使用する | クエリービルダー - 4.x](https://book.cakephp.org/4/ja/orm/query-
builder.html#id12)


CC BY-SA 4.0
2022-12-07T03:35:02.730
92613
2022-12-12T05:13:06.683
2022-12-12T05:13:06.683
2668
2668
92600
answer