Yii2のActiveQueryでselectに式を使う時の注意点

Yii2の ActiveQuery を使ってて select に式を使いたい時ってありますよね。

select を設定するのは普通にこんな感じ

$query = FooModel::find()->select([
    '*',
    'field1',
    'field2',
]);

追加で select を設定する時は”*”を忘れずに

$query = FooModel::find()->addSelect([
    'field3',
    'field4',
]);

もしくは addSelect() で設定する。

これは単に field を追加する例ですが普通に使っててあんまりこんな事ないですよね。
追加したいのはだいたいが、column に存在しないものを式として追加したい時

何も考えずにCASE文を追加するなら追加するならこうなる

$query = FooModel::find()->addSelect([
    'CASE WHEN foo1 IS NULL THEN foo2 ELSE foo3 END as foo',
]);

こうなるはずがこれだとエラーが出てしまう。

Column not found: 1054 Unknown column ‘CASE WHEN foo1 IS NULL THEN foo2 ELSE foo3 END’

こんなエラーが。
「そんなカラムねぇよ」と
知ってるよ。

じゃぁ select に式が使えないかというとそうじゃない。
ただの文字列を指定すると、それはカラムとしてYii2側で勝手に「“」を付けてくれてるんですな。

SELECT
    *
    `CASE WHEN foo1 IS NULL THEN foo2 ELSE foo3 END`
    FROM foo_model

実際にはこんなSQLが実行されてる。
そらエラーなるわ。

じゃぁどうするのかというと「()」と括弧を付けてやると
Yii2側でだたのカラム指定じゃなくて式なんだなと判定してくれるので無事実行されるようになる。

$query = FooModel::find()->addSelect([
    '(CASE WHEN foo1 IS NULL THEN foo2 ELSE foo3 END) as foo',
]);

こんな感じで括弧を入れてやる。

分かってしまえばなーんだって事やけど
知らないと少しハマるのでご注意ー

コメントを残す

メールアドレスが公開されることはありません。