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

Share on Facebook10Share on Google+0Tweet about this on TwitterShare on LinkedIn0

yii2framework

 

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',
]);

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

 

分かってしまえばなーんだって事やけど

知らないと少しハマるのでご注意ー

Share on Facebook10Share on Google+0Tweet about this on TwitterShare on LinkedIn0

あわせて読みたい

Fatal error: Uncaught Exception: 12: REST API is deprecated for versions v2.1 and higher (12) thrown in /var/www/junkpot.net/tech/html/wp-content/plugins/seo-facebook-comments/facebook/base_facebook.php on line 1273