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

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

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

CentOS さくらVPS Mysql 設定

いざMySQLの設定をしようとしたら /etc/my.cnf が無い。

無くても動くのね。

 

とりあえず文字コードとか最低限は設定したいので新規に作って設定。

無くても動くぐらいなんで最低限の設定だけ。

続きを読む CentOS さくらVPS Mysql 設定

CentOS さくらVPS Mysql groonga インストール

参考: URL

Mysqlをインストールしようとして

せっかくやしMysqlは日本語全文検索に対応させたいってことで

senna の後継になる groonga を導入してみようかと。

読みは公式サイト http://groonga.org/ の背景にもあるし「ぐるんが」でええんかな。

yum で管理出来るようなので楽チンっぽい。

続きを読む CentOS さくらVPS Mysql groonga インストール